From 1405edb71ffcdc64d18eff4dbebf48044a7a8cfb Mon Sep 17 00:00:00 2001 From: div0 Date: Sun, 28 Feb 2010 19:44:20 +0000 Subject: [PATCH] we don't need preshift, all transforms can be represented as one angles and one shift git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8711 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/warpzonelib/anglestransform.qc | 15 ++++------ data/qcsrc/warpzonelib/anglestransform.qh | 6 ++-- data/qcsrc/warpzonelib/common.qc | 35 ++++++++++------------- data/qcsrc/warpzonelib/common.qh | 1 + 4 files changed, 25 insertions(+), 32 deletions(-) diff --git a/data/qcsrc/warpzonelib/anglestransform.qc b/data/qcsrc/warpzonelib/anglestransform.qc index 9d974afe5..3bc749add 100644 --- a/data/qcsrc/warpzonelib/anglestransform.qc +++ b/data/qcsrc/warpzonelib/anglestransform.qc @@ -169,17 +169,14 @@ vector AnglesTransform_ApplyToVAngles(vector transform, vector v) } #endif -vector AnglesTransform_Multiply_GetPreShift(vector sf0, vector t0, vector st0, vector sf1, vector t1, vector st1) +vector AnglesTransform_Multiply_GetPostShift(vector t0, vector st0, vector t1, vector st1) { // we want the result of: - // t0 * (t1 * (p - sf1) + st1 - sf0) + st0 - // t0 * t1 * (p - sf1) + t0 * (st1 - sf0) + st0 - return sf1; + // t0 * (t1 * p + st1) + st0 + // t0 * t1 * p + t0 * st1 + st0 + return st0 + AnglesTransform_Apply(t0, st1); } -vector AnglesTransform_Multiply_GetPostShift(vector sf0, vector t0, vector st0, vector sf1, vector t1, vector st1) +vector AnglesTransform_PrePostShift_GetPostShift(vector sf, vector t, vector st) { - // we want the result of: - // t0 * (t1 * (p - sf1) + st1 - sf0) + st0 - // t0 * t1 * (p - sf1) + t0 * (st1 - sf0) + st0 - return AnglesTransform_Apply(t0, st1 - sf0) + st0; + return st - AnglesTransform_Apply(t, sf); } diff --git a/data/qcsrc/warpzonelib/anglestransform.qh b/data/qcsrc/warpzonelib/anglestransform.qh index 363f75e50..6c7166de7 100644 --- a/data/qcsrc/warpzonelib/anglestransform.qh +++ b/data/qcsrc/warpzonelib/anglestransform.qh @@ -22,6 +22,6 @@ vector AnglesTransform_Normalize(vector t, float minimize_roll); // makes sure a vector AnglesTransform_ApplyToAngles(vector transform, vector v); vector AnglesTransform_ApplyToVAngles(vector transform, vector v); -// transformed = (original - preshift) * transform + postshift -vector AnglesTransform_Multiply_GetPreShift(vector sf0, vector t0, vector st0, vector sf1, vector t1, vector st1); -vector AnglesTransform_Multiply_GetPostShift(vector sf0, vector t0, vector st0, vector sf1, vector t1, vector st1); +// transformed = original * transform + postshift +vector AnglesTransform_Multiply_GetPostShift(vector sf0, vector st0, vector t1, vector st1); +vector AnglesTransform_PrePostShift_GetPostShift(vector sf, vector t, vector st); diff --git a/data/qcsrc/warpzonelib/common.qc b/data/qcsrc/warpzonelib/common.qc index f71041b5d..ccdde987c 100644 --- a/data/qcsrc/warpzonelib/common.qc +++ b/data/qcsrc/warpzonelib/common.qc @@ -1,6 +1,7 @@ void WarpZone_SetUp(entity e, vector my_org, vector my_ang, vector other_org, vector other_ang) { e.warpzone_transform = AnglesTransform_Divide(other_ang, AnglesTransform_TurnDirectionFR(my_ang)); + e.warpzone_shift = AnglesTransform_PrePostShift_GetPostShift(my_org, e.warpzone_transform, other_org); e.warpzone_origin = my_org; e.warpzone_targetorigin = other_org; e.warpzone_angles = my_ang; @@ -36,8 +37,6 @@ float WarpZoneLib_BoxTouchesBrush_Recurse() if (trace_ent == WarpZoneLib_BoxTouchesBrush_ent) return 1; - - se = trace_ent; s = se.solid; se.solid = SOLID_NOT; @@ -279,7 +278,7 @@ float WarpZone_TargetPlaneDist(entity wz, vector v) vector WarpZone_TransformOrigin(entity wz, vector v) { - return wz.warpzone_targetorigin + AnglesTransform_Apply(wz.warpzone_transform, v - wz.warpzone_origin); + return wz.warpzone_shift + AnglesTransform_Apply(wz.warpzone_transform, v); } vector WarpZone_TransformVelocity(entity wz, vector v) @@ -309,7 +308,7 @@ vector WarpZone_TransformVAngles(entity wz, vector ang) vector WarpZone_UnTransformOrigin(entity wz, vector v) { - return wz.warpzone_origin + AnglesTransform_Apply(AnglesTransform_Invert(wz.warpzone_transform), v - wz.warpzone_targetorigin); + return AnglesTransform_Apply(AnglesTransform_Invert(wz.warpzone_transform), v - wz.warpzone_shift); } vector WarpZone_UnTransformVelocity(entity wz, vector v) @@ -348,13 +347,13 @@ vector WarpZoneLib_NearestPointOnBox(vector mi, vector ma, vector org) .float WarpZone_findradius_hit; .entity WarpZone_findradius_next; -void WarpZone_FindRadius_Recurse(vector org, float rad, vector org0, vector shift0, vector transform, vector shift1, float needlineofsight) +void WarpZone_FindRadius_Recurse(vector org, float rad, vector org0, vector transform, vector shift, float needlineofsight) // blast origin of current search original blast origin how to untransform (victim to blast system) { vector org_new; vector org0_new; - vector shift0_new, transform_new, shift1_new; - vector transform_second; + vector shift_new, transform_new; + vector shift_second, transform_second; vector p; entity e, e0; entity wz; @@ -390,8 +389,7 @@ void WarpZone_FindRadius_Recurse(vector org, float rad, vector org0, else { e.warpzone_transform = transform; - e.warpzone_origin = shift0; - e.warpzone_targetorigin = shift1; + e.warpzone_shift = shift; e.WarpZone_findradius_hit = 1; } @@ -404,14 +402,14 @@ void WarpZone_FindRadius_Recurse(vector org, float rad, vector org0, org_new = trace_endpos; transform_second = AnglesTransform_Invert(e.warpzone_transform); + shift_second = AnglesTransform_PrePostShift_GetPostShift(e.warpzone_shift, transform_second, '0 0 0'); // invert the shift transform_new = AnglesTransform_Multiply(transform, transform_second); - shift0_new = AnglesTransform_Multiply_GetPreShift(shift0, transform, shift1, e.warpzone_targetorigin, transform_second, e.warpzone_origin); - shift1_new = AnglesTransform_Multiply_GetPostShift(shift0, transform, shift1, e.warpzone_targetorigin, transform_second, e.warpzone_origin); + shift_new = AnglesTransform_Multiply_GetPostShift(transform, shift, transform_second, shift_second); WarpZone_FindRadius_Recurse( org_new, bound(0, rad - vlen(org_new - org0_new), rad - 8), org0_new, - shift0_new, transform_new, shift1_new, + transform_new, shift_new, needlineofsight); e.WarpZone_findradius_hit = 0; e.enemy.WarpZone_findradius_hit = 0; @@ -420,7 +418,7 @@ void WarpZone_FindRadius_Recurse(vector org, float rad, vector org0, entity WarpZone_FindRadius(vector org, float rad, float needlineofsight) { entity e0, e; - WarpZone_FindRadius_Recurse(org, rad, org, '0 0 0', '0 0 0', '0 0 0', needlineofsight); + WarpZone_FindRadius_Recurse(org, rad, org, '0 0 0', '0 0 0', needlineofsight); e0 = findchainfloat(WarpZone_findradius_hit, 1); for(e = e0; e; e = e.chain) e.WarpZone_findradius_hit = 0; @@ -430,18 +428,15 @@ entity WarpZone_FindRadius(vector org, float rad, float needlineofsight) void WarpZone_Accumulator_Clear(entity acc) { acc.warpzone_transform = '0 0 0'; - acc.warpzone_origin = '0 0 0'; - acc.warpzone_targetorigin = '0 0 0'; + acc.warpzone_shift = '0 0 0'; } void WarpZone_Accumulator_Add(entity acc, entity wz) { - vector sf, t, st; - sf = AnglesTransform_Multiply_GetPreShift(wz.warpzone_origin, wz.warpzone_transform, wz.warpzone_targetorigin, acc.warpzone_origin, acc.warpzone_transform, acc.warpzone_targetorigin); + vector t, st; t = AnglesTransform_Multiply(wz.warpzone_transform, acc.warpzone_transform); - st = AnglesTransform_Multiply_GetPostShift(wz.warpzone_origin, wz.warpzone_transform, wz.warpzone_targetorigin, acc.warpzone_origin, acc.warpzone_transform, acc.warpzone_targetorigin); - acc.warpzone_origin = sf; + st = AnglesTransform_Multiply_GetPostShift(wz.warpzone_transform, wz.warpzone_shift, acc.warpzone_transform, acc.warpzone_shift); acc.warpzone_transform = t; - acc.warpzone_targetorigin = st; + acc.warpzone_shift = st; } .entity WarpZone_refsys; diff --git a/data/qcsrc/warpzonelib/common.qh b/data/qcsrc/warpzonelib/common.qh index a637d6329..3d984d2ee 100644 --- a/data/qcsrc/warpzonelib/common.qh +++ b/data/qcsrc/warpzonelib/common.qh @@ -1,3 +1,4 @@ +.vector warpzone_shift; .vector warpzone_origin; .vector warpzone_angles; .vector warpzone_forward; -- 2.39.2