]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into martin-t/globals
authorMartin Taibr <taibr.martin@gmail.com>
Sat, 10 Nov 2018 14:35:41 +0000 (15:35 +0100)
committerMartin Taibr <taibr.martin@gmail.com>
Sat, 10 Nov 2018 14:35:41 +0000 (15:35 +0100)
qcsrc/client/csqcmodel_hooks.qc
qcsrc/client/teamradar.qc
qcsrc/client/view.qc
qcsrc/lib/float.qh
qcsrc/lib/vector.qh

index 961fc77572d2faea847fbefc8f2ec4d614b01736..86c672c239dddcec01af824319ec4a0ac2be5686 100644 (file)
@@ -541,7 +541,8 @@ void CSQCModel_Effects_Apply(entity this)
        if(this.csqcmodel_modelflags & MF_ROTATE)
        {
                this.renderflags |= RF_USEAXIS;
-               MAKEVECTORS(makevectors, this.angles + '0 100 0' * fmod(time, 3.6), v_forward, v_right, v_up);
+               makevectors(this.angles + '0 100 0' * fmod(time, 3.6));
+               //MAKEVECTORS(makevectors, this.angles + '0 100 0' * fmod(time, 3.6), v_forward, v_right, v_up);
        }
        if(this.csqcmodel_modelflags & MF_TRACER)
                tref = EFFECT_TR_WIZSPIKE.m_id;
index 26de41e7245aaf2e323287d065eb90ec5c81f50e..ddc7fc3224fd1cf0035825ca58ac2dcb3ad2b99d 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 ffab46236384284aa70f7b3e7538664401155bec..a8ce62946bc5a4f95704cc52143517008f317597 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 b4d1f0bd768c785f103ad3886f5453769e10c2ff..fa4ff77b5a1fee7cfb7d6c4f8312999aec33e53c 100644 (file)
@@ -2,3 +2,4 @@
 
 const float FLOAT_MAX = 340282346638528859811704183484516925440.0f;
 const float FLOAT_EPSILON = 0.00000011920928955078125f;
+const float FLOAT_NAN = 0.0 / 0.0;
index 8340381bab3aff467e543a1fdf1d1c19eacf1463..5c016e184b7c6710faed902bff2703b81bd60566 100644 (file)
@@ -1,5 +1,23 @@
 #pragma once
 
+#include "lib/float.qh"
+#include "lib/misc.qh"
+#include "lib/static.qh"
+
+//pseudo prototypes:
+// vector vec2(vector v); // returns a vector with just the x and y components of the given vector
+// vector vec2(float x, float y); // returns a vector with the given x and y components
+
+noref vector _vec2;
+#define vec2(...) EVAL(OVERLOAD(vec2, __VA_ARGS__))
+#define vec2_1(v) (_vec2 = (v), _vec2.z = 0, _vec2)
+#define vec2_2(x, y) (_vec2_x = (x), _vec2_y = (y), _vec2)
+
+noref vector _vec3;
+#define vec3(_x, _y, _z) (_vec3.x = (_x), _vec3.y = (_y), _vec3.z = (_z), _vec3)
+
+#define VEC_NAN vec3(FLOAT_NAN, FLOAT_NAN, FLOAT_NAN);
+
 noref vector _vlen2;
 #define vlen2(v) (_vlen2 = (v), dotproduct(_vlen2, _vlen2))
 
@@ -93,24 +111,43 @@ float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs) { ret
 #define YAW(v) ((v).y)
 #define ROLL(v) ((v).z)
 
-#define MAKEVECTORS(f, angles, forward, right, up) MACRO_BEGIN { \
-       f(angles); \
+#ifdef GAMEQC
+STATIC_INIT(globals) {
+       // set to NaN to more easily detect uninitialized use
+       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.
+/// 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
 
-//pseudo prototypes:
-// vector vec2(vector v); // returns a vector with just the x and y components of the given vector
-// vector vec2(float x, float y); // returns a vector with the given x and y components
-
-noref vector _vec2;
-#define vec2(...) EVAL(OVERLOAD(vec2, __VA_ARGS__))
-#define vec2_1(v) (_vec2 = (v), _vec2.z = 0, _vec2)
-#define vec2_2(x, y) (_vec2_x = (x), _vec2_y = (y), _vec2)
-
-noref vector _vec3;
-#define vec3(_x, _y, _z) (_vec3.x = (_x), _vec3.y = (_y), _vec3.z = (_z), _vec3)
+// 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);
+
+// 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)