diff --git a/include/QF/mathlib.h b/include/QF/mathlib.h index a74c5bf79..a454430ae 100644 --- a/include/QF/mathlib.h +++ b/include/QF/mathlib.h @@ -51,6 +51,7 @@ extern int nanmask; #define VectorScale(a,b,c) {(c)[0]=(a)[0]*(b);(c)[1]=(a)[1]*(b);(c)[2]=(a)[2]*(b);} #define VectorCompare(x, y) (((x)[0] == (y)[0]) && ((x)[1] == (y)[1]) && ((x)[2] == (y)[2])) +#define VectorIsZero(a) ((a)[0] == 0 && (a)[1] == 0 && (a)[2] == 0) #define VectorZero(a) ((a)[2] = (a)[1] = (a)[0] = 0); /* diff --git a/libs/gamecode/engine/pr_exec.c b/libs/gamecode/engine/pr_exec.c index 0115d9a14..61c76997f 100644 --- a/libs/gamecode/engine/pr_exec.c +++ b/libs/gamecode/engine/pr_exec.c @@ -40,6 +40,7 @@ #include "QF/console.h" #include "QF/cvar.h" +#include "QF/mathlib.h" #include "QF/progs.h" #include "QF/sys.h" #include "QF/zone.h" @@ -389,8 +390,7 @@ PR_ExecuteProgram (progs_t * pr, func_t fnum) OPC.integer_var = !OPA.float_var; break; case OP_NOT_V: - OPC.integer_var = !OPA.vector_var[0] && !OPA.vector_var[1] - && !OPA.vector_var[2]; + OPC.integer_var = VectorIsZero (OPA.vector_var); break; case OP_NOT_S: OPC.integer_var = !OPA.string_var || diff --git a/qw/source/cl_pred.c b/qw/source/cl_pred.c index 92b4125f8..084fa9ea7 100644 --- a/qw/source/cl_pred.c +++ b/qw/source/cl_pred.c @@ -37,6 +37,7 @@ #include "QF/keys.h" #include "bothdefs.h" +#include "compat.h" #include "cl_ents.h" #include "client.h" #include "pmove.h" @@ -53,8 +54,7 @@ CL_PredictUsercmd (player_state_t * from, player_state_t * to, usercmd_t *u, qboolean spectator) { // Dabb: if there is no movement to start with, don't predict... - if(cl_nostatpred->int_val && !from->velocity[0] && - !from->velocity[1] && !from->velocity[2]) { + if(cl_nostatpred->int_val && VectorIsZero (from->velocity)) { VectorCopy (from->origin, to->origin); VectorCopy (u->angles, to->viewangles); VectorCopy (from->velocity, to->velocity); @@ -113,7 +113,8 @@ CL_PredictMove (void) if (cl.paused) return; - cl.onground = 0; // assume on ground unless prediction says different + // assume on ground unless prediction says different + cl.onground = 0; cl.time = realtime - cls.latency - cl_pushlatency->value * 0.001; if (cl.time > realtime) @@ -135,8 +136,8 @@ CL_PredictMove (void) from = &cl.frames[cls.netchan.incoming_sequence & UPDATE_MASK]; // we can now render a frame - if (cls.state == ca_onserver) { // first update is the final signon - // stage + if (cls.state == ca_onserver) { + // first update is the final signon stage VID_SetCaption (cls.servername); CL_SetState (ca_active); } @@ -148,9 +149,8 @@ CL_PredictMove (void) } // Dabb: if there is no movement to start with, don't predict... - if(cl_nostatpred->int_val && !from->playerstate[cl.playernum].velocity[0] - && !from->playerstate[cl.playernum].velocity[1] - && !from->playerstate[cl.playernum].velocity[2]) { + if (cl_nostatpred->int_val + && VectorIsZero (from->playerstate[cl.playernum].velocity)) { VectorCopy (from->playerstate[cl.playernum].velocity, cl.simvel); VectorCopy (from->playerstate[cl.playernum].origin, cl.simorg); return; @@ -165,8 +165,8 @@ CL_PredictMove (void) for (i = 1; i < UPDATE_BACKUP - 1 && cls.netchan.incoming_sequence + i < cls.netchan.outgoing_sequence; i++) { to = &cl.frames[(cls.netchan.incoming_sequence + i) & UPDATE_MASK]; - CL_PredictUsercmd (&from->playerstate[cl.playernum] - , &to->playerstate[cl.playernum], &to->cmd, + CL_PredictUsercmd (&from->playerstate[cl.playernum], + &to->playerstate[cl.playernum], &to->cmd, cl.spectator); cl.onground = onground; if (to->senttime >= cl.time) @@ -183,19 +183,12 @@ CL_PredictMove (void) // now interpolate some fraction of the final frame if (to->senttime == from->senttime) f = 0; - else { - f = (cl.time - from->senttime) / (to->senttime - from->senttime); - - if (f < 0) - f = 0; - if (f > 1) - f = 1; - } + else + f = bound(0, (cl.time - from->senttime) / (to->senttime - from->senttime), 1); for (i = 0; i < 3; i++) - if (fabs - (from->playerstate[cl.playernum].origin[i] - - to->playerstate[cl.playernum].origin[i]) > 128) { + if (fabs (from->playerstate[cl.playernum].origin[i] - + to->playerstate[cl.playernum].origin[i]) > 128) { // teleported, so don't lerp VectorCopy (to->playerstate[cl.playernum].velocity, cl.simvel); VectorCopy (to->playerstate[cl.playernum].origin, cl.simorg); diff --git a/qw/source/pmove.c b/qw/source/pmove.c index 04de616a2..f7147f3f2 100644 --- a/qw/source/pmove.c +++ b/qw/source/pmove.c @@ -267,7 +267,7 @@ PM_GroundMove (void) vec3_t original, originalvel, down, up, downvel; pmove.velocity[2] = 0; - if (!pmove.velocity[0] && !pmove.velocity[1] && !pmove.velocity[2]) + if (VectorIsZero (pmove.velocity)) return; // first try just moving to the destination diff --git a/qw/source/sv_phys.c b/qw/source/sv_phys.c index 0dff65eee..7c0bc5c08 100644 --- a/qw/source/sv_phys.c +++ b/qw/source/sv_phys.c @@ -503,8 +503,7 @@ SV_PushMove (edict_t *pusher, float movetime) int i; vec3_t move; - if (!SVvector (pusher, velocity)[0] && !SVvector (pusher, velocity)[1] - && !SVvector (pusher, velocity)[2]) { + if (VectorIsZero (SVvector (pusher, velocity))) { SVfloat (pusher, ltime) += movetime; return; }