From 98f8ce73cc9556b6227fb4ea75ea8fc900be8d5a Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Tue, 10 Aug 2010 09:11:27 +0200 Subject: [PATCH] warpzones: optimize tracing if no warpzones exist (less extra work) --- qcsrc/warpzonelib/client.qc | 2 ++ qcsrc/warpzonelib/common.qc | 38 +++++++++++++++++++++++++++++++++---- qcsrc/warpzonelib/common.qh | 3 +++ qcsrc/warpzonelib/server.qc | 2 ++ 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/qcsrc/warpzonelib/client.qc b/qcsrc/warpzonelib/client.qc index 1dbe824d6..d084e0808 100644 --- a/qcsrc/warpzonelib/client.qc +++ b/qcsrc/warpzonelib/client.qc @@ -1,5 +1,6 @@ void WarpZone_Read(float isnew) { + ++warpzone_warpzones_exist; if not(self.enemy) { self.enemy = spawn(); @@ -46,6 +47,7 @@ void WarpZone_Read(float isnew) void WarpZone_Camera_Read(float isnew) { + ++warpzone_cameras_exist; self.classname = "func_warpzone_camera"; self.origin_x = ReadCoord(); self.origin_y = ReadCoord(); diff --git a/qcsrc/warpzonelib/common.qc b/qcsrc/warpzonelib/common.qc index 2fa8d55e4..360652d6f 100644 --- a/qcsrc/warpzonelib/common.qc +++ b/qcsrc/warpzonelib/common.qc @@ -174,6 +174,27 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, vector o0, e0; entity wz; vector vf, vr, vu; + + WarpZone_Trace_InitTransform(); + if(!warpzone_warpzones_exist) + { + if(nomonsters == MOVE_NOTHING) + { + trace_endpos = end; + trace_fraction = 1; + if(cb) + cb(org, trace_endpos, end); + return; + } + else + { + tracebox(org, mi, ma, end, nomonsters, forent); + if(cb) + cb(org, trace_endpos, end); + return; + } + } + vf = v_forward; vr = v_right; vu = v_up; @@ -193,7 +214,6 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, if((contentshack = (forent.dphitcontentsmask && !(forent.dphitcontentsmask & DPCONTENTS_SOLID)))) forent.dphitcontentsmask |= DPCONTENTS_SOLID; - WarpZone_Trace_InitTransform(); // if starting in warpzone, first transform wz = WarpZone_Find(org + mi, org + ma); if(wz) @@ -283,13 +303,24 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo vector vf, vr, vu, v0, o0; entity wz; + WarpZone_Trace_InitTransform(); + WarpZone_tracetoss_time = 0; + if(!warpzone_warpzones_exist) + { + tracetoss(e, forent); + if(cb) + cb(e.origin, trace_endpos, trace_endpos); + dt = vlen(e.origin - o0) / vlen(e.velocity); + WarpZone_tracetoss_time += dt; + return; + } + vf = v_forward; vr = v_right; vu = v_up; o0 = e.origin; v0 = e.velocity; - WarpZone_Trace_InitTransform(); // if starting in warpzone, first transform wz = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs); if(wz) @@ -308,7 +339,6 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo } WarpZone_MakeAllSolid(); g = cvar("sv_gravity") * e.gravity; - WarpZone_tracetoss_time = 0; i = 16; for(;;) { @@ -322,9 +352,9 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo if(cb) cb(e.origin, trace_endpos, trace_endpos); e.origin = trace_endpos; - e.velocity_z -= WarpZone_tracetoss_time * g; dt = vlen(e.origin - o0) / vlen(e.velocity); WarpZone_tracetoss_time += dt; + e.velocity_z -= WarpZone_tracetoss_time * g; if(trace_fraction >= 1) break; if(trace_ent.classname != "trigger_warpzone") diff --git a/qcsrc/warpzonelib/common.qh b/qcsrc/warpzonelib/common.qh index ec2e50d16..8405ce6d3 100644 --- a/qcsrc/warpzonelib/common.qh +++ b/qcsrc/warpzonelib/common.qh @@ -1,6 +1,9 @@ // uncomment this if your mod uses the roll angle in fixangle // #define KEEP_ROLL +float warpzone_warpzones_exist; +float warpzone_cameras_exist; + const void func_null(void); // never assign to this one please .float warpzone_isboxy; diff --git a/qcsrc/warpzonelib/server.qc b/qcsrc/warpzonelib/server.qc index 33b736e56..7c53d6e4a 100644 --- a/qcsrc/warpzonelib/server.qc +++ b/qcsrc/warpzonelib/server.qc @@ -303,6 +303,7 @@ void WarpZoneCamera_InitStep_FindTarget() error("Camera with nonexisting target"); return; } + ++warpzone_cameras_exist; WarpZone_Camera_SetUp(self, self.enemy.origin, self.enemy.angles); } @@ -436,6 +437,7 @@ void WarpZone_InitStep_FinalizeTransform() return; } + ++warpzone_warpzones_exist; WarpZone_SetUp(self, self.warpzone_origin, self.warpzone_angles, self.enemy.warpzone_origin, self.enemy.warpzone_angles); self.touch = WarpZone_Touch; self.SendFlags = 0xFFFFFF; -- 2.39.2