[nexuiz-commits] r8711 - trunk/data/qcsrc/warpzonelib

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Feb 28 14:44:20 EST 2010


Author: div0
Date: 2010-02-28 14:44:20 -0500 (Sun, 28 Feb 2010)
New Revision: 8711

Modified:
   trunk/data/qcsrc/warpzonelib/anglestransform.qc
   trunk/data/qcsrc/warpzonelib/anglestransform.qh
   trunk/data/qcsrc/warpzonelib/common.qc
   trunk/data/qcsrc/warpzonelib/common.qh
Log:
we don't need preshift, all transforms can be represented as one angles and one shift

Modified: trunk/data/qcsrc/warpzonelib/anglestransform.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/anglestransform.qc	2010-02-28 19:44:16 UTC (rev 8710)
+++ trunk/data/qcsrc/warpzonelib/anglestransform.qc	2010-02-28 19:44:20 UTC (rev 8711)
@@ -169,17 +169,14 @@
 }
 #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);
 }

Modified: trunk/data/qcsrc/warpzonelib/anglestransform.qh
===================================================================
--- trunk/data/qcsrc/warpzonelib/anglestransform.qh	2010-02-28 19:44:16 UTC (rev 8710)
+++ trunk/data/qcsrc/warpzonelib/anglestransform.qh	2010-02-28 19:44:20 UTC (rev 8711)
@@ -22,6 +22,6 @@
 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);

Modified: trunk/data/qcsrc/warpzonelib/common.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qc	2010-02-28 19:44:16 UTC (rev 8710)
+++ trunk/data/qcsrc/warpzonelib/common.qc	2010-02-28 19:44:20 UTC (rev 8711)
@@ -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 @@
 	if (trace_ent == WarpZoneLib_BoxTouchesBrush_ent)
 		return 1;
 
-	
-
 	se = trace_ent;
 	s = se.solid;
 	se.solid = SOLID_NOT;
@@ -279,7 +278,7 @@
 
 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_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 @@
 
 .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 @@
 			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 @@
 		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 @@
 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 @@
 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;

Modified: trunk/data/qcsrc/warpzonelib/common.qh
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qh	2010-02-28 19:44:16 UTC (rev 8710)
+++ trunk/data/qcsrc/warpzonelib/common.qh	2010-02-28 19:44:20 UTC (rev 8711)
@@ -1,3 +1,4 @@
+.vector warpzone_shift;
 .vector warpzone_origin;
 .vector warpzone_angles;
 .vector warpzone_forward;



More information about the nexuiz-commits mailing list