From: Mario 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 75fc8d31e..ef1a9663d 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 fbbe60350..f636696e6 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 f5052b376..0a8cd8ef3 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