#else
#define NULL (RVALUE, world)
#endif
-
-#include "lib/accumulate.qh"
-#include "lib/misc.qh"
-#include "lib/static.qh"
-#include "lib/vector.qh"
-
-//void(vector) _vectorvectors;
-
-#ifdef GAMEQC
-STATIC_INIT(globals) {
- //_vectorvectors = vectorvectors;
-
- // set to NaN to more easily detect uninitialized use
- v_forward = VEC_NAN;
- v_right = VEC_NAN;
- v_up = VEC_NAN;
-}
-
-/// 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.
-/// It's 2018, they even teach that globals are bad at my uni... though for some reason they never explained why. Sigh.
-#define MAKEVECTORS(angles, forward, right, up) MACRO_BEGIN { \
- makevectors(angles); \
- forward = v_forward; \
- right = v_right; \
- up = v_up; \
- v_forward = VEC_NAN; \
- v_right = VEC_NAN; \
- v_up = VEC_NAN; \
-} MACRO_END
-
-// Same as `MAKEVECTORS` but also creates the locals for convenience.
-#define MAKEVECTORS_NEW(angles, forward, right, up) \
- vector forward = '0 0 0'; \
- vector right = '0 0 0'; \
- vector up = '0 0 0'; \
- MAKEVECTORS(angles, forward, right, up);
-
-#define VECTOR_VECTORS(forward_in, forward, right, up) MACRO_BEGIN { \
- vectorvectors_broken(forward_in); \
- forward = v_forward; \
- right = v_right; \
- up = v_up; \
- v_forward = VEC_NAN; \
- v_right = VEC_NAN; \
- v_up = VEC_NAN; \
-} MACRO_END
-
-#define VECTOR_VECTORS_NEW(forward_in, forward, right, up) \
- vector forward = '0 0 0'; \
- vector right = '0 0 0'; \
- vector up = '0 0 0'; \
- VECTOR_VECTORS(forward_in, forward, right, up);
-
-#define vectorvectors DO_NOT_USE_GLOBALS
-
-// FIXME find a good place for this
-// FIXME MAKE_VECTORS because current naming sucks
-// FIXME ban vectorvectors
-
-// TODO when raw makevectors and similar functions are not used anywhere else anymore,
-// assert that the global vectors are NaN before calling makevectors in MAKEVECTORS
-// to make sure nobody (even builtins) is accidentally using them - NaN is the most liekly value to expose values clearly
-// also uncomment these:
-//#define makevectors DO_NOT_USE_GLOBALS
-//#define v_forward DO_NOT_USE_GLOBALS
-//#define v_right DO_NOT_USE_GLOBALS
-//#define v_up DO_NOT_USE_GLOBALS
-// FIXME ^ won't work
-#endif
--- /dev/null
+#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.
+
+// FIXME MAKE_VECTORS because current naming sucks
+
+#ifdef GAMEQC
+STATIC_INIT(globals) {
+ // set to NaN to more easily detect uninitialized use
+ // TODO when all functions are wrapped and the raw functions are not used anymore,
+ // assert that the global vectors are NaN before calling the raw functions
+ // to make sure nobody (even builtins) is accidentally using them - NaN is the most likely value to expose remaining usages
+ v_forward = VEC_NAN;
+ v_right = VEC_NAN;
+ v_up = VEC_NAN;
+}
+#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 MAKEVECTORS(angles, forward, right, up) MACRO_BEGIN { \
+ makevectors(angles); \
+ forward = v_forward; \
+ right = v_right; \
+ up = v_up; \
+ v_forward = VEC_NAN; \
+ v_right = VEC_NAN; \
+ v_up = VEC_NAN; \
+} MACRO_END
+
+/// Same as `MAKEVECTORS` but also creates the locals for convenience.
+#define MAKEVECTORS_NEW(angles, forward, right, up) \
+ vector forward = '0 0 0'; \
+ vector right = '0 0 0'; \
+ vector up = '0 0 0'; \
+ MAKEVECTORS(angles, forward, right, up);
+
+#define VECTOR_VECTORS(forward_in, forward, right, up) MACRO_BEGIN { \
+ _vectorvectors_hidden(forward_in); \
+ forward = v_forward; \
+ right = v_right; \
+ up = v_up; \
+ v_forward = VEC_NAN; \
+ v_right = VEC_NAN; \
+ v_up = VEC_NAN; \
+} MACRO_END
+
+#define VECTOR_VECTORS_NEW(forward_in, forward, right, up) \
+ vector forward = '0 0 0'; \
+ vector right = '0 0 0'; \
+ vector up = '0 0 0'; \
+ VECTOR_VECTORS(forward_in, forward, right, up);