ergonomics initiative for MAKEVECTORS
authorMartin Taibr <taibr.martin@gmail.com>
Tue, 6 Nov 2018 13:18:33 +0000 (14:18 +0100)
committerMartin Taibr <taibr.martin@gmail.com>
Tue, 6 Nov 2018 13:18:43 +0000 (14:18 +0100)
qcsrc/client/teamradar.qc
qcsrc/client/view.qc
qcsrc/lib/vector.qh

index 26de41e..ddc7fc3 100644 (file)
@@ -93,8 +93,7 @@ void draw_teamradar_player(vector coord3d, vector pangles, vector rgb)
 
        coord = teamradar_texcoord_to_2dcoord(teamradar_3dcoord_to_texcoord(coord3d));
 
-       vector forward = '0 0 0', right = '0 0 0', up = '0 0 0';
-       MAKEVECTORS(makevectors, pangles - '0 1 0' * teamradar_angle, forward, right, up);
+       MAKEVECTORS_NEW(pangles - '0 1 0' * teamradar_angle, forward, right, up);
        if(v_flipped)
        {
                forward.x = -forward.x;
index ffab462..a8ce629 100644 (file)
@@ -141,8 +141,7 @@ void calc_followmodel_ofs(entity view)
                vel = view.velocity;
        else
        {
-               vector forward = '0 0 0', right = '0 0 0', up = '0 0 0';
-               MAKEVECTORS(makevectors, view_angles, forward, right, up);
+               MAKEVECTORS_NEW(view_angles, forward, right, up);
                vel.x = view.velocity * forward;
                vel.y = view.velocity * right * -1;
                vel.z = view.velocity * up;
@@ -167,8 +166,7 @@ void calc_followmodel_ofs(entity view)
        if (autocvar_cl_followmodel_velocity_absolute)
        {
                vector fixed_gunorg;
-               vector forward = '0 0 0', right = '0 0 0', up = '0 0 0';
-               MAKEVECTORS(makevectors, view_angles, forward, right, up);
+               MAKEVECTORS_NEW(view_angles, forward, right, up);
                fixed_gunorg.x = gunorg * forward;
                fixed_gunorg.y = gunorg * right * -1;
                fixed_gunorg.z = gunorg * up;
@@ -1946,7 +1944,7 @@ void CSQC_UpdateView(entity this, float w, float h)
        // Render the Scene
        view_origin = getpropertyvec(VF_ORIGIN);
        view_angles = getpropertyvec(VF_ANGLES);
-       MAKEVECTORS(makevectors, view_angles, view_forward, view_right, view_up);
+       MAKEVECTORS(view_angles, view_forward, view_right, view_up);
 
 #ifdef BLURTEST
        if(time > blurtest_time0 && time < blurtest_time1)
index 2900a0f..6a92bbe 100644 (file)
@@ -120,10 +120,11 @@ STATIC_INIT(globals) {
 }
 #endif
 
-// TODO when raw makevectors in not used anywhere else, assert that the global vectors are NaN before calling makevectors here
-// to make sure nobody is accidentally using them
-#define MAKEVECTORS(f, angles, forward, right, up) MACRO_BEGIN { \
-       f(angles); \
+/// 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; \
@@ -132,6 +133,22 @@ STATIC_INIT(globals) {
        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; \
+       vector right; \
+       vector up; \
+       MAKEVECTORS(angles, forward, right, up);
+
+// 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
+
 ERASEABLE
 vector Rotate(vector v, float a)
 {