From: Mario <mario@smbclan.net>
Date: Sun, 7 Aug 2016 04:14:59 +0000 (+1000)
Subject: Add a mutator parameter for the physics tick rate
X-Git-Tag: xonotic-v0.8.2~746
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=02cfcd8c645bd0b60cf8fb6e5c039d5b46f3f735;p=xonotic%2Fxonotic-data.pk3dir.git

Add a mutator parameter for the physics tick rate
---

diff --git a/qcsrc/common/mutators/events.qh b/qcsrc/common/mutators/events.qh
index 75fc8d31e1..ef1a9663d7 100644
--- a/qcsrc/common/mutators/events.qh
+++ b/qcsrc/common/mutators/events.qh
@@ -92,6 +92,7 @@ MUTATOR_HOOKABLE(PlayerJump, EV_PlayerJump);
 #define EV_PM_Physics(i, o) \
     /** player */       i(entity, MUTATOR_ARGV_0_entity) \
     /** maxspeed_mod */ i(float, MUTATOR_ARGV_1_float) \
+    /** tick rate */    i(float, MUTATOR_ARGV_2_float) \
     /**/
 MUTATOR_HOOKABLE(PM_Physics, EV_PM_Physics);
 
diff --git a/qcsrc/common/mutators/mutator/bugrigs/bugrigs.qc b/qcsrc/common/mutators/mutator/bugrigs/bugrigs.qc
index fbbe603504..f636696e64 100644
--- a/qcsrc/common/mutators/mutator/bugrigs/bugrigs.qc
+++ b/qcsrc/common/mutators/mutator/bugrigs/bugrigs.qc
@@ -60,7 +60,7 @@ void bugrigs_SetVars()
 
 #endif
 
-void RaceCarPhysics(entity this)
+void RaceCarPhysics(entity this, float dt)
 {
 	// using this move type for "big rigs"
 	// the engine does not push the entity!
@@ -114,35 +114,35 @@ void RaceCarPhysics(entity this)
 		{
 			if (myspeed > 0)
 			{
-				myspeed = max(0, myspeed - PHYS_INPUT_TIMELENGTH * (PHYS_BUGRIGS_FRICTION_FLOOR(this) - PHYS_BUGRIGS_FRICTION_BRAKE(this) * accel));
+				myspeed = max(0, myspeed - dt * (PHYS_BUGRIGS_FRICTION_FLOOR(this) - PHYS_BUGRIGS_FRICTION_BRAKE(this) * accel));
 			}
 			else
 			{
 				if (!PHYS_BUGRIGS_REVERSE_SPEEDING(this))
-					myspeed = min(0, myspeed + PHYS_INPUT_TIMELENGTH * PHYS_BUGRIGS_FRICTION_FLOOR(this));
+					myspeed = min(0, myspeed + dt * PHYS_BUGRIGS_FRICTION_FLOOR(this));
 			}
 		}
 		else
 		{
 			if (myspeed >= 0)
 			{
-				myspeed = max(0, myspeed - PHYS_INPUT_TIMELENGTH * PHYS_BUGRIGS_FRICTION_FLOOR(this));
+				myspeed = max(0, myspeed - dt * PHYS_BUGRIGS_FRICTION_FLOOR(this));
 			}
 			else
 			{
 				if (PHYS_BUGRIGS_REVERSE_STOPPING(this))
 					myspeed = 0;
 				else
-					myspeed = min(0, myspeed + PHYS_INPUT_TIMELENGTH * (PHYS_BUGRIGS_FRICTION_FLOOR(this) + PHYS_BUGRIGS_FRICTION_BRAKE(this) * accel));
+					myspeed = min(0, myspeed + dt * (PHYS_BUGRIGS_FRICTION_FLOOR(this) + PHYS_BUGRIGS_FRICTION_BRAKE(this) * accel));
 			}
 		}
 		// terminal velocity = velocity at which 50 == accelfactor, that is, 1549 units/sec
 		//MAXIMA: friction(v) := PHYS_BUGRIGS_FRICTION_FLOOR(this);
 
-		this.angles_y += steer * PHYS_INPUT_TIMELENGTH * steerfactor; // apply steering
+		this.angles_y += steer * dt * steerfactor; // apply steering
 		makevectors(this.angles); // new forward direction!
 
-		myspeed += accel * accelfactor * PHYS_INPUT_TIMELENGTH;
+		myspeed += accel * accelfactor * dt;
 
 		rigvel = myspeed * v_forward + '0 0 1' * upspeed;
 	}
@@ -153,13 +153,13 @@ void RaceCarPhysics(entity this)
 		// responsiveness factor for steering and acceleration
 		float f = 1 / (1 + pow(max(0, myspeed / PHYS_BUGRIGS_SPEED_REF(this)), PHYS_BUGRIGS_SPEED_POW(this)));
 		float steerfactor = -myspeed * f;
-		this.angles_y += steer * PHYS_INPUT_TIMELENGTH * steerfactor; // apply steering
+		this.angles_y += steer * dt * steerfactor; // apply steering
 
 		rigvel = this.velocity;
 		makevectors(this.angles); // new forward direction!
 	}
 
-	rigvel *= max(0, 1 - vlen(rigvel) * PHYS_BUGRIGS_FRICTION_AIR(this) * PHYS_INPUT_TIMELENGTH);
+	rigvel *= max(0, 1 - vlen(rigvel) * PHYS_BUGRIGS_FRICTION_AIR(this) * dt);
 	//MAXIMA: airfriction(v) := v * v * PHYS_BUGRIGS_FRICTION_AIR(this);
 	//MAXIMA: total_acceleration(v) := accel(v) - friction(v) - airfriction(v);
 	//MAXIMA: solve(total_acceleration(v) = 0, v);
@@ -169,7 +169,7 @@ void RaceCarPhysics(entity this)
 		vector rigvel_xy, neworigin, up;
 		float mt;
 
-		rigvel_z -= PHYS_INPUT_TIMELENGTH * PHYS_GRAVITY(this); // 4x gravity plays better
+		rigvel_z -= dt * PHYS_GRAVITY(this); // 4x gravity plays better
 		rigvel_xy = vec2(rigvel);
 
 		if (PHYS_BUGRIGS_CAR_JUMPING(this))
@@ -182,10 +182,10 @@ void RaceCarPhysics(entity this)
 
 		// BUG RIGS: align the move to the surface instead of doing collision testing
 		// can we move?
-		tracebox(trace_endpos, this.mins, this.maxs, trace_endpos + rigvel_xy * PHYS_INPUT_TIMELENGTH, mt, this);
+		tracebox(trace_endpos, this.mins, this.maxs, trace_endpos + rigvel_xy * dt, mt, this);
 
 		// align to surface
-		tracebox(trace_endpos, this.mins, this.maxs, trace_endpos - up + '0 0 1' * rigvel_z * PHYS_INPUT_TIMELENGTH, mt, this);
+		tracebox(trace_endpos, this.mins, this.maxs, trace_endpos - up + '0 0 1' * rigvel_z * dt, mt, this);
 
 		if (trace_fraction < 0.5)
 		{
@@ -213,12 +213,12 @@ void RaceCarPhysics(entity this)
 			UNSET_ONGROUND(this);
 		}
 
-		this.velocity = (neworigin - this.origin) * (1.0 / PHYS_INPUT_TIMELENGTH);
+		this.velocity = (neworigin - this.origin) * (1.0 / dt);
 		set_movetype(this, MOVETYPE_NOCLIP);
 	}
 	else
 	{
-		rigvel_z -= PHYS_INPUT_TIMELENGTH * PHYS_GRAVITY(this); // 4x gravity plays better
+		rigvel_z -= dt * PHYS_GRAVITY(this); // 4x gravity plays better
 		this.velocity = rigvel;
 		set_movetype(this, MOVETYPE_FLY);
 	}
@@ -251,7 +251,7 @@ void RaceCarPhysics(entity this)
 	// smooth the angles
 	vector vf1, vu1, smoothangles;
 	makevectors(this.angles);
-	float f = bound(0, PHYS_INPUT_TIMELENGTH * PHYS_BUGRIGS_ANGLE_SMOOTHING(this), 1);
+	float f = bound(0, dt * PHYS_BUGRIGS_ANGLE_SMOOTHING(this), 1);
 	if (f == 0)
 		f = 1;
 	vf1 = v_forward * f;
@@ -270,6 +270,7 @@ void RaceCarPhysics(entity this)
 MUTATOR_HOOKFUNCTION(bugrigs, PM_Physics)
 {
     entity player = M_ARGV(0, entity);
+    float dt = M_ARGV(2, float);
 
 	if(!PHYS_BUGRIGS(player) || !IS_PLAYER(player)) { return; }
 
@@ -277,7 +278,7 @@ MUTATOR_HOOKFUNCTION(bugrigs, PM_Physics)
 	player.angles = player.bugrigs_prevangles;
 #endif
 
-	RaceCarPhysics(player);
+	RaceCarPhysics(player, dt);
 	return true;
 }
 
diff --git a/qcsrc/ecs/systems/physics.qc b/qcsrc/ecs/systems/physics.qc
index f5052b376f..0a8cd8ef32 100644
--- a/qcsrc/ecs/systems/physics.qc
+++ b/qcsrc/ecs/systems/physics.qc
@@ -84,7 +84,7 @@ void sys_phys_update(entity this, float dt)
 			PHYS_TELEPORT_TIME(this) = 0;
 			PHYS_WATERJUMP_TIME(this) = 0;
 		}
-	} else if (MUTATOR_CALLHOOK(PM_Physics, this, maxspeed_mod)) {
+	} else if (MUTATOR_CALLHOOK(PM_Physics, this, maxspeed_mod, dt)) {
 		// handled
 	} else if (this.move_movetype == MOVETYPE_NOCLIP
 	    || this.move_movetype == MOVETYPE_FLY