[nexuiz-commits] r8715 - trunk/data/qcsrc/warpzonelib
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Sun Feb 28 14:44:42 EST 2010
Author: div0
Date: 2010-02-28 14:44:41 -0500 (Sun, 28 Feb 2010)
New Revision: 8715
Modified:
trunk/data/qcsrc/warpzonelib/common.qc
trunk/data/qcsrc/warpzonelib/common.qh
Log:
handle traces correctly if starting inside a warpzone
Modified: trunk/data/qcsrc/warpzonelib/common.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qc 2010-02-28 19:44:36 UTC (rev 8714)
+++ trunk/data/qcsrc/warpzonelib/common.qc 2010-02-28 19:44:41 UTC (rev 8715)
@@ -93,17 +93,26 @@
{
float frac, sol;
vector o0, e0;
- entity e;
+ entity wz;
vector vf, vr, vu;
vf = v_forward;
vr = v_right;
vu = v_up;
+ // if starting in warpzone, first transform
+ wz = WarpZone_Find(org + mi, org + ma);
+ if(wz)
+ {
+ org = WarpZone_TransformOrigin(wz, trace_endpos);
+ end = WarpZone_TransformOrigin(wz, end);
+ WarpZone_trace_velocity = WarpZone_TransformVelocity(wz, WarpZone_trace_velocity);
+ WarpZone_trace_angles = WarpZone_TransformAngles(wz, WarpZone_trace_angles);
+ WarpZone_trace_v_angle = WarpZone_TransformVAngles(wz, WarpZone_trace_v_angle);
+ }
WarpZone_MakeAllSolid();
o0 = org;
e0 = end;
sol = -1;
frac = 0;
- e = world;
for(;;)
{
tracebox(org, mi, ma, end, nomonsters, forent);
@@ -116,18 +125,18 @@
frac = trace_fraction = frac + (1 - frac) * trace_fraction;
if(trace_ent.classname != "trigger_warpzone")
break;
- // we hit a warpzone... so, let's perform the trace after the warp again
- org = WarpZone_TransformOrigin(trace_ent, trace_endpos);
- end = WarpZone_TransformOrigin(trace_ent, end);
- WarpZone_trace_velocity = WarpZone_TransformVelocity(trace_ent, WarpZone_trace_velocity);
- WarpZone_trace_angles = WarpZone_TransformAngles(trace_ent, WarpZone_trace_angles);
- WarpZone_trace_v_angle = WarpZone_TransformVAngles(trace_ent, WarpZone_trace_v_angle);
- if(trace_ent == e)
+ if(trace_ent == wz)
{
dprint("I transformed into the same zone again, wtf, aborting the trace\n");
break;
}
- e = trace_ent;
+ wz = trace_ent;
+ // we hit a warpzone... so, let's perform the trace after the warp again
+ org = WarpZone_TransformOrigin(wz, trace_endpos);
+ end = WarpZone_TransformOrigin(wz, end);
+ WarpZone_trace_velocity = WarpZone_TransformVelocity(wz, WarpZone_trace_velocity);
+ WarpZone_trace_angles = WarpZone_TransformAngles(wz, WarpZone_trace_angles);
+ WarpZone_trace_v_angle = WarpZone_TransformVAngles(wz, WarpZone_trace_v_angle);
}
WarpZone_MakeAllOther();
trace_startsolid = sol;
@@ -141,17 +150,34 @@
{
float frac, sol;
vector o0, e0;
- entity e;
+ entity wz;
vector vf, vr, vu;
vf = v_forward;
vr = v_right;
vu = v_up;
+ // if starting in warpzone, first transform
+ wz = WarpZone_Find(org + mi, org + ma);
+ if(wz)
+ {
+ if(wz != zone)
+ {
+ // we are in ANOTHER warpzone. This is bad. Make a zero length trace and return.
+ sol = 1;
+ trace_fraction = 0;
+ trace_endpos = org;
+ goto fail;
+ }
+ org = WarpZone_TransformOrigin(wz, trace_endpos);
+ end = WarpZone_TransformOrigin(wz, end);
+ WarpZone_trace_velocity = WarpZone_TransformVelocity(wz, WarpZone_trace_velocity);
+ WarpZone_trace_angles = WarpZone_TransformAngles(wz, WarpZone_trace_angles);
+ WarpZone_trace_v_angle = WarpZone_TransformVAngles(wz, WarpZone_trace_v_angle);
+ }
WarpZone_MakeAllSolid();
o0 = org;
e0 = end;
sol = -1;
frac = 0;
- e = world;
for(;;)
{
tracebox(org, mi, ma, end, nomonsters, forent);
@@ -166,20 +192,21 @@
break;
if(trace_ent != zone)
break;
- // we hit a warpzone... so, let's perform the trace after the warp again
- org = WarpZone_TransformOrigin(trace_ent, trace_endpos);
- end = WarpZone_TransformOrigin(trace_ent, end);
- WarpZone_trace_velocity = WarpZone_TransformVelocity(trace_ent, WarpZone_trace_velocity);
- WarpZone_trace_angles = WarpZone_TransformAngles(trace_ent, WarpZone_trace_angles);
- WarpZone_trace_v_angle = WarpZone_TransformVAngles(trace_ent, WarpZone_trace_v_angle);
- if(trace_ent == e)
+ if(trace_ent == wz)
{
dprint("I transformed into the same zone again, wtf, aborting the trace\n");
break;
}
- e = trace_ent;
+ wz = trace_ent;
+ // we hit a warpzone... so, let's perform the trace after the warp again
+ org = WarpZone_TransformOrigin(wz, trace_endpos);
+ end = WarpZone_TransformOrigin(wz, end);
+ WarpZone_trace_velocity = WarpZone_TransformVelocity(wz, WarpZone_trace_velocity);
+ WarpZone_trace_angles = WarpZone_TransformAngles(wz, WarpZone_trace_angles);
+ WarpZone_trace_v_angle = WarpZone_TransformVAngles(wz, WarpZone_trace_v_angle);
}
WarpZone_MakeAllOther();
+:fail
trace_startsolid = sol;
WarpZone_trace_endpos = o0 + (e0 - o0) * trace_fraction;
v_forward = vf;
@@ -196,9 +223,17 @@
{
float g, dt;
vector vf, vr, vu, v0, o0;
+ entity wz;
vf = v_forward;
vr = v_right;
vu = v_up;
+ // if starting in warpzone, first transform
+ wz = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs);
+ if(wz)
+ {
+ setorigin(e, WarpZone_TransformOrigin(wz, e.origin));
+ e.velocity = WarpZone_TransformVelocity(wz, e.velocity);
+ }
WarpZone_MakeAllSolid();
g = cvar("sv_gravity") * e.gravity;
WarpZone_tracetoss_time = 0;
@@ -217,9 +252,15 @@
break;
if(trace_ent.classname != "trigger_warpzone")
break;
+ if(trace_ent == wz)
+ {
+ dprint("I transformed into the same zone again, wtf, aborting the trace\n");
+ break;
+ }
+ wz = trace_ent;
// we hit a warpzone... so, let's perform the trace after the warp again
- e.origin = WarpZone_TransformOrigin(trace_ent, e.origin);
- e.velocity = WarpZone_TransformVelocity(trace_ent, e.velocity);
+ e.origin = WarpZone_TransformOrigin(wz, e.origin);
+ e.velocity = WarpZone_TransformVelocity(wz, e.velocity);
}
WarpZone_MakeAllOther();
v_forward = vf;
@@ -432,10 +473,10 @@
}
void WarpZone_Accumulator_AddTransform(entity acc, vector t, vector s)
{
- vector t, st;
- t = AnglesTransform_Multiply(t, acc.warpzone_transform);
+ vector tr, st;
+ tr = AnglesTransform_Multiply(t, acc.warpzone_transform);
st = AnglesTransform_Multiply_GetPostShift(t, s, acc.warpzone_transform, acc.warpzone_shift);
- acc.warpzone_transform = t;
+ acc.warpzone_transform = tr;
acc.warpzone_shift = st;
}
void WarpZone_Accumulator_Add(entity acc, entity wz)
Modified: trunk/data/qcsrc/warpzonelib/common.qh
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qh 2010-02-28 19:44:36 UTC (rev 8714)
+++ trunk/data/qcsrc/warpzonelib/common.qh 2010-02-28 19:44:41 UTC (rev 8715)
@@ -18,7 +18,6 @@
void WarpZone_MakeAllOther();
var void(vector start, vector hit, vector end) WarpZone_trace_callback; // called after every trace
-vector WarpZone_trace_startpos; // start pos of the current segment (useful for the callback)
vector WarpZone_trace_angles; // total angles accumulator
vector WarpZone_trace_v_angle; // total v_angle accumulator
vector WarpZone_trace_velocity; // total velocity
More information about the nexuiz-commits
mailing list