X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Flib%2Fdeglobalization.qh;h=55dbbe525d14127bb868840d42fdc42036aa894e;hp=42c6f760ec235e156a5b43b81c562394c1c85574;hb=991de5e6922cd3c283de56c3249624f0f1bfe767;hpb=4ce4c47c67100ab599a28690fe9999d4d85d062a diff --git a/qcsrc/lib/deglobalization.qh b/qcsrc/lib/deglobalization.qh index 42c6f760e..55dbbe525 100644 --- a/qcsrc/lib/deglobalization.qh +++ b/qcsrc/lib/deglobalization.qh @@ -1,27 +1,23 @@ +#include "lib/float.qh" #include "lib/misc.qh" #include "lib/static.qh" #include "lib/vector.qh" // These macros wrap functions which use globals so mutation only occurs inside them and is not visible from outside. -// Functions for which all usages are replaced with these macros can be hidden inside our `*defs.qh` files -// to prevent anyone from using them accidentally. +// Functions for which all usages are replaced with these macros can be hidden by #defines inside our `*defs.qh` files +// to prevent anyone from using them accidentally in the future // TODO stuff in the engine that uses the v_forward/v_right/v_up globals and is not wrapped yet: // - 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) -// - adddynamiclight -// - makestatic -#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'; - -#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,64 +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 \ + SET_V_GLOBALS(forward, right, up); \ + _adddynamiclight_hidden(org, radius, lightcolours); \ + CLEAR_V_GLOBALS(); \ +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);