r5754 - in trunk/data/qcsrc: client common server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Thu Feb 5 06:35:49 EST 2009


Author: div0
Date: 2009-02-05 06:35:49 -0500 (Thu, 05 Feb 2009)
New Revision: 5754

Modified:
   trunk/data/qcsrc/client/projectile.qc
   trunk/data/qcsrc/common/util.qc
   trunk/data/qcsrc/common/util.qh
   trunk/data/qcsrc/server/portals.qc
   trunk/data/qcsrc/server/w_seeker.qc
Log:
refactoring of portal transforms code to be generally usable;
use it to make the grenade smoke come out of the red thing on the grenade model


Modified: trunk/data/qcsrc/client/projectile.qc
===================================================================
--- trunk/data/qcsrc/client/projectile.qc	2009-02-05 10:14:04 UTC (rev 5753)
+++ trunk/data/qcsrc/client/projectile.qc	2009-02-05 11:35:49 UTC (rev 5754)
@@ -1,3 +1,6 @@
+.float spawntime;
+.vector trail_oldorigin;
+
 void SUB_Null()
 {
 }
@@ -13,8 +16,11 @@
 .float gravity;
 .float snd_looping;
 
-void Projectile_DrawTrail(vector from, vector to)
+void Projectile_DrawTrail(vector to)
 {
+	vector from;
+	from = self.trail_oldorigin;
+	self.trail_oldorigin = to;
 	switch(self.cnt)
 	{
 		case PROJECTILE_ROCKET:
@@ -61,35 +67,57 @@
 
 void Projectile_Draw()
 {
-	vector oldorg;
+	vector rot;
+	vector trailorigin;
 
-	oldorg = self.origin;
-
 	if(self.count & 0x80)
 	{
 		//self.move_flags &~= FL_ONGROUND;
 		Movetype_Physics(TRUE);
-		self.angles = vectoangles(self.velocity);
+		if(!(self.move_flags & FL_ONGROUND))
+			self.angles = vectoangles(self.velocity);
 	}
 	else
 	{
 		InterpolateOrigin_Do();
 	}
 
-	Projectile_DrawTrail(oldorg, self.origin);
+	if(!(self.move_flags & FL_ONGROUND))
+	{
+		rot = '0 0 0';
+		switch(self.cnt)
+		{
+			case PROJECTILE_GRENADE:
+				rot = '-750 0 0';
+				break;
+			case PROJECTILE_GRENADE_BOUNCING:
+				rot = '0 -750 0';
+				break;
+			case PROJECTILE_HOOKBOMB:
+				rot = '0 1000 0';
+				break;
+			default:
+				break;
+		}
+		self.angles = AnglesTransform_Multiply(self.angles, rot * (time - self.spawntime));
 
+		fixedmakevectors(self.angles);
+
+		trailorigin = self.origin;
+		switch(self.cnt)
+		{
+			case PROJECTILE_GRENADE:
+			case PROJECTILE_GRENADE_BOUNCING:
+				trailorigin += v_right * 1 + v_forward * -10;
+				break;
+			default:
+				break;
+		}
+		Projectile_DrawTrail(trailorigin);
+	}
+
 	switch(self.cnt)
 	{
-		case PROJECTILE_GRENADE:
-			self.angles -= '750 0 0' * time;
-			break;
-		case PROJECTILE_GRENADE_BOUNCING:
-			if(!(self.move_flags & FL_ONGROUND))
-				self.angles += '100 150 100' * time;
-			break;
-		case PROJECTILE_HOOKBOMB:
-			self.angles = '0 500 0' * time;
-			break;
 		case PROJECTILE_BULLET_GLOWING:
 			R_AddDynamicLight(self.origin, 50, '1 1 0');
 			break;
@@ -120,7 +148,7 @@
 	if(self.count & 0x80)
 	{
 		tracebox(self.origin, self.mins, self.maxs, self.origin + self.velocity * 0.05, MOVE_NORMAL, self);
-		Projectile_DrawTrail(self.origin, trace_endpos);
+		Projectile_DrawTrail(trace_endpos);
 	}
 }
 
@@ -153,7 +181,10 @@
 
 	// sv_gameplayfix_delayprojectiles
 	if(!self.move_time)
+	{
 		self.move_time = time + ticrate;
+		self.spawntime = time + ticrate;
+	}
 	else
 		self.move_time = max(self.move_time, time);
 
@@ -175,6 +206,8 @@
 			self.move_origin = self.origin;
 			self.move_velocity = self.velocity;
 		}
+
+		self.trail_oldorigin = self.origin;
 	}
 
 	if(f & 2)

Modified: trunk/data/qcsrc/common/util.qc
===================================================================
--- trunk/data/qcsrc/common/util.qc	2009-02-05 10:14:04 UTC (rev 5753)
+++ trunk/data/qcsrc/common/util.qc	2009-02-05 11:35:49 UTC (rev 5754)
@@ -1307,3 +1307,53 @@
 
 // requires the same, but is a stronger condition
 float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs) {return smins_x >= bmins_x && smaxs_x <= bmaxs_x && smins_y >= bmins_y && smaxs_y <= bmaxs_y && smins_z >= bmins_z && smaxs_z <= bmaxs_z;};
+
+#ifndef MENUQC
+// angles transforms
+// angles in fixedmakevectors/fixedvectoangles space
+vector AnglesTransform_Apply(vector transform, vector v)
+{
+	fixedmakevectors(transform);
+	return v_forward * v_x
+	     + v_right   * (-v_y)
+		 + v_up      * v_z;
+}
+
+vector AnglesTransform_Multiply(vector t1, vector t2)
+{
+	vector m_forward, m_up;
+	fixedmakevectors(t2); m_forward = v_forward; m_up = v_up;
+	m_forward = AnglesTransform_Apply(t1, m_forward); m_up = AnglesTransform_Apply(t1, m_up);
+	return fixedvectoangles2(m_forward, m_up);
+}
+
+vector AnglesTransform_Invert(vector transform)
+{
+	vector i_forward, i_up;
+	fixedmakevectors(transform);
+	// we want angles that turn v_forward into '1 0 0', v_right into '0 1 0' and v_up into '0 0 1'
+	// but these are orthogonal unit vectors!
+	// so to invert, we can simply fixedvectoangles the TRANSPOSED matrix
+	// TODO is this always -transform?
+	i_forward_x = v_forward_x;
+	i_forward_y = -v_right_x;
+	i_forward_z = v_up_x;
+	i_up_x = v_forward_z;
+	i_up_y = -v_right_z;
+	i_up_z = v_up_z;
+	return fixedvectoangles2(i_forward, i_up);
+}
+
+vector AnglesTransform_TurnDirection(vector transform)
+{
+	// turn 180 degrees around v_up
+	// changes in-direction to out-direction
+	fixedmakevectors(transform);
+	return fixedvectoangles2(-1 * v_forward, 1 * v_up);
+}
+
+vector AnglesTransform_Divide(vector to_transform, vector from_transform)
+{
+	return AnglesTransform_Multiply(to_transform, AnglesTransform_Invert(from_transform));
+}
+#endif

Modified: trunk/data/qcsrc/common/util.qh
===================================================================
--- trunk/data/qcsrc/common/util.qh	2009-02-05 10:14:04 UTC (rev 5753)
+++ trunk/data/qcsrc/common/util.qh	2009-02-05 11:35:49 UTC (rev 5754)
@@ -135,3 +135,11 @@
 
 float boxesoverlap(vector m1, vector m2, vector m3, vector m4);
 float boxinsidebox(vector smins, vector smaxs, vector bmins, vector bmaxs);
+
+#ifndef MENUQC
+vector AnglesTransform_Apply(vector transform, vector v);
+vector AnglesTransform_Multiply(vector t1, vector t2);
+vector AnglesTransform_Invert(vector transform);
+vector AnglesTransform_TurnDirection(vector transform);
+vector AnglesTransform_Divide(vector to_transform, vector from_transform);
+#endif

Modified: trunk/data/qcsrc/server/portals.qc
===================================================================
--- trunk/data/qcsrc/server/portals.qc	2009-02-05 10:14:04 UTC (rev 5753)
+++ trunk/data/qcsrc/server/portals.qc	2009-02-05 11:35:49 UTC (rev 5754)
@@ -6,63 +6,6 @@
 .float portal_wants_to_vanish;
 .float portal_activatetime;
 
-vector Portal_Transform_Apply(vector transform, vector v)
-{
-	fixedmakevectors(transform);
-	return v_forward * v_x
-	     + v_right   * (-v_y)
-		 + v_up      * v_z;
-}
-
-vector Portal_Transform_Multiply(vector t1, vector t2)
-{
-	vector m_forward, m_up;
-	fixedmakevectors(t2); m_forward = v_forward; m_up = v_up;
-	m_forward = Portal_Transform_Apply(t1, m_forward); m_up = Portal_Transform_Apply(t1, m_up);
-	return fixedvectoangles2(m_forward, m_up);
-}
-
-vector Portal_Transform_Invert(vector transform)
-{
-	vector i_forward, i_up;
-	fixedmakevectors(transform);
-	// we want angles that turn v_forward into '1 0 0', v_right into '0 1 0' and v_up into '0 0 1'
-	// but these are orthogonal unit vectors!
-	// so to invert, we can simply fixedvectoangles the TRANSPOSED matrix
-	// TODO is this always -transform?
-	i_forward_x = v_forward_x;
-	i_forward_y = -v_right_x;
-	i_forward_z = v_up_x;
-	i_up_x = v_forward_z;
-	i_up_y = -v_right_z;
-	i_up_z = v_up_z;
-#ifdef DEBUG
-	vector v;
-	v = fixedvectoangles2(i_forward, i_up);
-	print("Transform: ", vtos(transform), "\n");
-	print("Inverted: ", vtos(v), "\n");
-	print("Verify: ", vtos(Portal_Transform_Multiply(v, transform)), "\n");
-	fixedmakevectors(Portal_Transform_Multiply(v, transform));
-	print("Verify: ", vtos(v_forward), "\n");
-	print("Verify: ", vtos(v_right), "\n");
-	print("Verify: ", vtos(v_up), "\n");
-#endif
-	return fixedvectoangles2(i_forward, i_up);
-}
-
-vector Portal_Transform_TurnDirection(vector transform)
-{
-	// turn 180 degrees around v_up
-	// changes in-direction to out-direction
-	fixedmakevectors(transform);
-	return fixedvectoangles2(-1 * v_forward, 1 * v_up);
-}
-
-vector Portal_Transform_Divide(vector to_transform, vector from_transform)
-{
-	return Portal_Transform_Multiply(to_transform, Portal_Transform_Invert(from_transform));
-}
-
 float PlayerEdgeDistance(entity p, vector v)
 {
 	vector vbest;
@@ -94,8 +37,8 @@
 	transform = teleporter.portal_transform;
 
 	to = teleporter.enemy.origin;
-	to = to + Portal_Transform_Apply(teleporter.portal_transform, player.origin - from);
-	newvel = Portal_Transform_Apply(transform, player.velocity);
+	to = to + AnglesTransform_Apply(teleporter.portal_transform, player.origin - from);
+	newvel = AnglesTransform_Apply(transform, player.velocity);
 	// this now is INSIDE the plane... can't use that
 	
 	// shift it out
@@ -144,13 +87,13 @@
 		ang = player.v_angle;
 		/*
 		ang_x = bound(-89, mod(-ang_x + 180, 360) - 180, 89);
-		ang = Portal_Transform_Multiply(transform, ang);
+		ang = AnglesTransform_Multiply(transform, ang);
 		*/
 
 		// PLAYERS use different math
 		ang_x = -ang_x;
 
-		//print("reference: ", vtos(Portal_Transform_Multiply(transform, ang)), "\n");
+		//print("reference: ", vtos(AnglesTransform_Multiply(transform, ang)), "\n");
 
 		fixedmakevectors(ang);
 		old_forward = v_forward;
@@ -159,9 +102,9 @@
 		old_yawforward = v_forward;
 
 		// their aiming directions are portalled...
-		new_forward = Portal_Transform_Apply(transform, old_forward);
-		new_up = Portal_Transform_Apply(transform, old_up);
-		new_yawforward = Portal_Transform_Apply(transform, old_yawforward);
+		new_forward = AnglesTransform_Apply(transform, old_forward);
+		new_up = AnglesTransform_Apply(transform, old_up);
+		new_yawforward = AnglesTransform_Apply(transform, old_yawforward);
 
 		// but now find a new sense of direction
 		// this is NOT easy!
@@ -193,11 +136,11 @@
 	else
 	{
 		ang = player.angles;
-		ang = Portal_Transform_Multiply(transform, player.angles);
+		ang = AnglesTransform_Multiply(transform, player.angles);
 	}
 
 	// factor -1 allows chaining portals, but may be weird
-	player.right_vector = -1 * Portal_Transform_Apply(transform, player.right_vector);
+	player.right_vector = -1 * AnglesTransform_Apply(transform, player.right_vector);
 
 	if(player.flagcarried)
 		DropFlag(player.flagcarried, player, world);
@@ -383,36 +326,8 @@
 
 void Portal_Connect(entity teleporter, entity destination)
 {
-	teleporter.portal_transform = Portal_Transform_Divide(Portal_Transform_TurnDirection(destination.angles), teleporter.angles);
+	teleporter.portal_transform = AnglesTransform_Divide(AnglesTransform_TurnDirection(destination.angles), teleporter.angles);
 
-#ifdef DEBUG
-	{
-		// let's verify the transform
-		vector in_f, in_r, in_u;
-		vector out_f, out_r, out_u;
-		fixedmakevectors(teleporter.angles);
-		in_f = v_forward;
-		in_r = v_right;
-		in_u = v_up;
-		print("teleporter: ", vtos(in_f), " ", vtos(in_r), " ", vtos(in_u), "\n");
-		fixedmakevectors(destination.angles);
-		out_f = v_forward;
-		out_r = v_right;
-		out_u = v_up;
-		print("dest: ", vtos(out_f), " ", vtos(out_r), " ", vtos(out_u), "\n");
-		// INTENDED TRANSFORM:
-		//   in_f -> -out_f
-		//   in_r -> -out_r
-		//   in_u -> +out_u
-		print("FORWARD: ", vtos(in_f), " -> ", vtos(Portal_Transform_Apply(teleporter.portal_transform, in_f)), ", should be", vtos(-1 * out_f), "\n");
-		print("RIGHT: ", vtos(in_r), " -> ", vtos(Portal_Transform_Apply(teleporter.portal_transform, in_r)), ", should be", vtos(-1 * out_r), "\n");
-		print("UP: ", vtos(in_u), " -> ", vtos(Portal_Transform_Apply(teleporter.portal_transform, in_u)), ", should be", vtos(out_u), "\n");
-
-		te_lightning3(world, teleporter.origin, teleporter.origin + in_r * 1000);
-		te_lightning3(world, destination.origin, destination.origin + out_r * 1000);
-	}
-#endif
-
 	teleporter.enemy = destination;
 	destination.enemy = teleporter;
 	Portal_MakeInPortal(teleporter);

Modified: trunk/data/qcsrc/server/w_seeker.qc
===================================================================
--- trunk/data/qcsrc/server/w_seeker.qc	2009-02-05 10:14:04 UTC (rev 5753)
+++ trunk/data/qcsrc/server/w_seeker.qc	2009-02-05 11:35:49 UTC (rev 5754)
@@ -247,13 +247,6 @@
 	self = oldself;
 }
 
-void Seeker_Tag_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
-	self.health = self.health - damage;
-	if (self.health <= 0)
-		self.think ();
-}
-
 void Seeker_Tag_Explode ()
 {
 	//if(other==self.owner)
@@ -263,6 +256,13 @@
 	remove (self);
 }
 
+void Seeker_Tag_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+	self.health = self.health - damage;
+	if (self.health <= 0)
+		Seeker_Tag_Explode();
+}
+
 void Seeker_Tag_Think()
 {
 	remove(self);




More information about the nexuiz-commits mailing list