]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/lib/deglobalization.qh
Merge branch 'master' into martin-t/globals
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / deglobalization.qh
index 73c92fc03fd2055d4e12da9dd037c3d4159c1319..55dbbe525d14127bb868840d42fdc42036aa894e 100644 (file)
 //  - RF_USEAXIS, addentities, predraw,
 //    - CL_GetEntityMatrix (in engine but is called from other functions so transitively any of them can use the globals - e.g. V_CalcRefdef, maybe others)
 //    - however RF_USEAXIS is only used if MF_ROTATE is used which is only set in one place
-//  - e.camera_transform / CL_VM_TransformView (in engine
+//  - e.camera_transform / CL_VM_TransformView (in engine)
 //    - this is the only used function that both sets and gets the globals (aim does too but isn't used in our code)
 
-#define NEW_VECS(...) EVAL(OVERLOAD(NEW_VECS, __VA_ARGS__))
-#define NEW_VECS_3(forward, right, up) vector forward = '0 0 0'; vector right = '0 0 0'; vector up = '0 0 0';
-#define NEW_VECS_4(forward, right, up, origin) NEW_VECS_3(forward, right, up); vector origin = '0 0 0';
-
-// convenience for deglobalized code - don't use these just to hide that globals are still used
-#define CLEAR_V_GLOBALS() v_forward = VEC_NAN; v_right = VEC_NAN; v_up = VEC_NAN;
-#define GET_V_GLOBALS(forward, right, up) forward = v_forward; right = v_right; up = v_up;
-#define SET_V_GLOBALS(forward, right, up) v_forward = forward; v_right = right; v_up = up;
+// convenience for deglobalization code - don't use these just to hide that globals are still used
+#define CLEAR_V_GLOBALS() v_forward = VEC_NAN; v_right = VEC_NAN; v_up = VEC_NAN
+#define GET_V_GLOBALS(forward, right, up) forward = v_forward; right = v_right; up = v_up
+#define SET_V_GLOBALS(forward, right, up) v_forward = forward; v_right = right; v_up = up
 
 #ifdef GAMEQC
 STATIC_INIT(globals) {
@@ -31,70 +27,64 @@ STATIC_INIT(globals) {
        // and assert that the global vectors are NaN before calling the raw functions here
        // to make sure nobody (even builtins) is accidentally using them - NaN is the most likely value to expose remaining usages
 
-       // TODO make sure `isnan` actually works - potential compiler bug:
-       //LOG_INFOF("%f\n", 0.0/0.0 == 0.0/0.0);
-       //LOG_INFOF("%f\n", 0.0/0.0 != 0.0/0.0);
-       //float x = 0.0/0.0;
-       //LOG_INFOF("%f\n", x == x);
-       //LOG_INFOF("%f\n", x != x);
-
        CLEAR_V_GLOBALS();
 }
 #endif
 
 /// Same as the `makevectors` builtin but uses the provided locals instead of the `v_*` globals.
 /// Always use this instead of raw `makevectors` to make the data flow clear.
-#define MAKE_VECTORS(angles, forward, right, up) MACRO_BEGIN { \
+/// Note that you might prefer `FIXED_MAKE_VECTORS` for new code.
+#define MAKE_VECTORS(angles, forward, right, up) MACRO_BEGIN \
        _makevectors_hidden(angles); \
        GET_V_GLOBALS(forward, right, up); \
        CLEAR_V_GLOBALS(); \
-MACRO_END
+MACRO_END
 
 /// Same as `MAKE_VECTORS` but also creates the locals for convenience.
 #define MAKE_VECTORS_NEW(angles, forward, right, up) \
-       NEW_VECS(forward, right, up); \
+       vector forward = '0 0 0', right = '0 0 0', up = '0 0 0'; \
        MAKE_VECTORS(angles, forward, right, up);
 
 /// Returns all 4 vectors by assigning to them (instead of returning a value) for consistency (and sanity)
-#define SKEL_GET_BONE_ABS(skel, bonenum, forward, right, up, origin) MACRO_BEGIN \
+#define SKEL_GET_BONE_ABS(skel, bonenum, forward, right, up, origin) MACRO_BEGIN \
        origin = _skel_get_boneabs_hidden(skel, bonenum) \
        GET_V_GLOBALS(forward, right, up); \
        CLEAR_V_GLOBALS(); \
-MACRO_END
+MACRO_END
 
 #define SKEL_GET_BONE_ABS_NEW(skel, bonenum, forward, right, up, origin) \
-       NEW_VECS(forward, right, up, origin); \
+       vector forward = '0 0 0', right = '0 0 0', up = '0 0 0', origin = '0 0 0'; \
        SKEL_GET_BONE_ABS(skel, bonenum, forward, right, up, origin)
 
-#define SKEL_SET_BONE(skel, bonenum, org, forward, right, up) MACRO_BEGIN \
+#define SKEL_SET_BONE(skel, bonenum, org, forward, right, up) MACRO_BEGIN \
        SET_V_GLOBALS(forward, right, up); \
        _skel_set_bone_hidden(skel, bonenum, org); \
        CLEAR_V_GLOBALS(); \
-MACRO_END
+MACRO_END
 
-#define ADD_DYNAMIC_LIGHT(org, radius, lightcolours, forward, right, up) MACRO_BEGIN \
+#define ADD_DYNAMIC_LIGHT(org, radius, lightcolours, forward, right, up) MACRO_BEGIN \
        SET_V_GLOBALS(forward, right, up); \
        _adddynamiclight_hidden(org, radius, lightcolours); \
        CLEAR_V_GLOBALS(); \
-MACRO_END
+MACRO_END
 
-#define VECTOR_VECTORS(forward_in, forward, right, up) MACRO_BEGIN \
+#define VECTOR_VECTORS(forward_in, forward, right, up) MACRO_BEGIN \
        _vectorvectors_hidden(forward_in); \
        GET_V_GLOBALS(forward, right, up); \
        CLEAR_V_GLOBALS(); \
-MACRO_END
+MACRO_END
 
 #define VECTOR_VECTORS_NEW(forward_in, forward, right, up) \
-       NEW_VECS(forward, right, up); \
+       vector forward = '0 0 0', right = '0 0 0', up = '0 0 0'; \
        VECTOR_VECTORS(forward_in, forward, right, up);
 
 /// Note that this only avoids the v_* globals, not the gettaginfo_* ones
-#define GET_TAG_INFO(ent, tagindex, forward, right, up, origin) MACRO_BEGIN {  \
+#define GET_TAG_INFO(ent, tagindex, forward, right, up, origin) MACRO_BEGIN \
        origin = _gettaginfo_hidden(ent, tagindex); \
        GET_V_GLOBALS(forward, right, up); \
        CLEAR_V_GLOBALS(); \
-MACRO_END
+MACRO_END
 
 #define GET_TAG_INFO_NEW(ent, tagindex, forward, right, up, origin) \
-       NEW_VECS(forward, right, up, origin); \
+       vector forward = '0 0 0', right = '0 0 0', up = '0 0 0', origin = '0 0 0'; \
        GET_TAG_INFO(ent, tagindex, forward, right, up, origin);