From: Martin Taibr Date: Sat, 10 Nov 2018 14:55:06 +0000 (+0100) Subject: wip X-Git-Tag: xonotic-v0.8.5~1258^2~52 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=53550b760062dd4e99f92d6881d647511e7d6422;p=xonotic%2Fxonotic-data.pk3dir.git wip --- diff --git a/qcsrc/client/csqcmodel_hooks.qc b/qcsrc/client/csqcmodel_hooks.qc index 86c672c23..0b62704c5 100644 --- a/qcsrc/client/csqcmodel_hooks.qc +++ b/qcsrc/client/csqcmodel_hooks.qc @@ -542,7 +542,6 @@ void CSQCModel_Effects_Apply(entity this) { this.renderflags |= RF_USEAXIS; 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; diff --git a/qcsrc/common/weapons/weapon/shockwave.qc b/qcsrc/common/weapons/weapon/shockwave.qc index 7e60667e5..26e5587d4 100644 --- a/qcsrc/common/weapons/weapon/shockwave.qc +++ b/qcsrc/common/weapons/weapon/shockwave.qc @@ -663,9 +663,10 @@ void Draw_Shockwave(entity this) // WEAPONTODO: trace to find what we actually hit vector endpos = (this.sw_shotorg + (this.sw_shotdir * this.sw_distance)); - vectorvectors(this.sw_shotdir); - vector right = v_right; // save this for when we do makevectors later - vector up = v_up; // save this for when we do makevectors later + //vectorvectors(this.sw_shotdir); + //vector right = v_right; // save this for when we do makevectors later + //vector up = v_up; // save this for when we do makevectors later + VECTOR_VECTORS_NEW(this.sw_shotdir, _forward, right, up); // WEAPONTODO: combine and simplify these calculations vector min_end = ((this.sw_shotorg + (this.sw_shotdir * SW_DISTTOMIN)) + (up * this.sw_spread_min)); diff --git a/qcsrc/dpdefs/post.qh b/qcsrc/dpdefs/post.qh index 70e5f3784..73c51dda9 100644 --- a/qcsrc/dpdefs/post.qh +++ b/qcsrc/dpdefs/post.qh @@ -16,3 +16,73 @@ #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(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 diff --git a/qcsrc/lib/static.qh b/qcsrc/lib/static.qh index e0ec96b8e..bc456f1cc 100644 --- a/qcsrc/lib/static.qh +++ b/qcsrc/lib/static.qh @@ -1,5 +1,8 @@ #pragma once +#include "lib/macro.qh" +#include "lib/log.qh" + #define GETTIME_REALTIME 1 #ifdef MENUQC float(int tmr) _gettime = #67; diff --git a/qcsrc/lib/vector.qh b/qcsrc/lib/vector.qh index 5c016e184..eae8d4397 100644 --- a/qcsrc/lib/vector.qh +++ b/qcsrc/lib/vector.qh @@ -1,22 +1,6 @@ #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)) @@ -111,43 +95,19 @@ float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs) { ret #define YAW(v) ((v).y) #define ROLL(v) ((v).z) -#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 +//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) -/// 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); - -// 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 +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); ERASEABLE vector Rotate(vector v, float a)