phys->in_air = 1;
- float pstep = ktimestep*10.0f;
+ float pstep = VG_TIMESTEP_FIXED * 10.0f;
float best_velocity_delta = -9999.9f;
float k_bias = 0.96f;
phys->slip = slip;
phys->reverse = -vg_signf(vel[2]);
- float substep = ktimestep * 0.2f;
- float fwd_resistance = (vg_get_button( "break" )? 5.0f: 0.02f) * -substep;
+ float substep = VG_TIMESTEP_FIXED * 0.2f;
+
+#if 0
+ float fwd_resistance = vg_get_button( "break" )? 5.0f: k_friction_resistance;
+#else
+ float fwd_resistance = k_friction_resistance;
+#endif
for( int i=0; i<5; i++ )
{
- vel[2] = stable_force( vel[2], vg_signf( vel[2] ) * fwd_resistance );
- vel[0] = stable_force( vel[0],
- vg_signf( vel[0] ) * -k_friction_lat*substep );
+ vel[2] = stable_force( vel[2],vg_signf(vel[2]) * -fwd_resistance*substep);
+ vel[0] = stable_force( vel[0],vg_signf(vel[0]) * -k_friction_lat*substep);
}
- static double start_push = 0.0;
- if( vg_get_button_down( "push" ) )
- start_push = vg_time;
-
if( vg_get_button( "jump" ) )
{
- phys->jump += ktimestep * k_jump_charge_speed;
+ phys->jump += VG_TIMESTEP_FIXED * k_jump_charge_speed;
if( !phys->jump_charge )
phys->jump_dir = phys->reverse > 0.0f? 1: 0;
phys->jump_charge = 1;
}
- if( !vg_get_button("break") && vg_get_button( "push" ) )
+ static int push_thresh_last = 0;
+ float push_amt = vg_get_axis( "walk/push" ) * 0.5f + 0.5f;
+ int push_thresh = push_amt>0.15f? 1: 0;
+
+ if( push_thresh && !push_thresh_last )
+ player.phys.start_push = vg.time;
+
+ push_thresh_last = push_thresh;
+
+ if( !vg_get_button("break") && push_thresh )
{
- player.pushing = 1.0f;
- player.push_time = vg_time-start_push;
+ player.phys.pushing = 1.0f;
+ player.phys.push_time = vg.time - player.phys.start_push;
- float cycle_time = player.push_time*k_push_cycle_rate,
- amt = k_push_accel * (sinf(cycle_time)*0.5f+0.5f)*ktimestep,
+ float cycle_time = player.phys.push_time*k_push_cycle_rate,
+ amt = k_push_accel * (sinf(cycle_time)*0.5f+0.5f)*VG_TIMESTEP_FIXED,
current = v3_length( vel ),
new_vel = vg_minf( current + amt, k_max_push_speed );
/* Pumping */
static float previous = 0.0f;
float delta = previous - phys->grab,
- pump = delta * k_pump_force*ktimestep;
+ pump = delta * k_pump_force * VG_TIMESTEP_FIXED;
previous = phys->grab;
v3f p1;
m3x3_mulv( phys->rb.to_world, vel, phys->rb.v );
- float steer = vg_get_axis( "horizontal" );
- phys->iY -= vg_signf(steer)*powf(steer,2.0f) * k_steer_ground * ktimestep;
+ float steer = vg_get_axis( "lookh" ),
+ steer_scaled = vg_signf(steer) * powf(steer,2.0f) * k_steer_ground;
+
+ phys->iY -= steer_scaled * VG_TIMESTEP_FIXED;
}
/*
/*
* Prediction
*/
- float pstep = ktimestep*10.0f;
+ float pstep = VG_TIMESTEP_FIXED * 10.0f;
v3f pco, pco1, pv;
v3_copy( phys->rb.co, pco );
if( angle < 0.99f )
{
v4f correction;
- q_axis_angle( correction, axis, acosf(angle)*0.05f*(1.0f-limiter) );
+ q_axis_angle( correction, axis,
+ acosf(angle)*(1.0f-limiter)*3.0f*VG_TIMESTEP_FIXED );
q_mul( correction, phys->rb.q, phys->rb.q );
}
time_to_impact += pstep;
}
- phys->iY -= vg_get_axis( "horizontal" ) * k_steer_air * ktimestep;
+ phys->iY -= vg_get_axis( "lookh" ) * k_steer_air * VG_TIMESTEP_FIXED;
{
- float iX = vg_get_axis( "vertical" ) *
- phys->reverse * k_steer_air * limiter * ktimestep;
+ float iX = vg_get_axis( "lookv" ) *
+ phys->reverse * k_steer_air * limiter * VG_TIMESTEP_FIXED;
static float siX = 0.0f;
siX = vg_lerpf( siX, iX, k_steer_air_lerp );
}
v2f target = {0.0f,0.0f};
- v2_muladds( target, (v2f){ vg_get_axis("h1"), vg_get_axis("v1") },
+ v2_muladds( target, (v2f){ vg_get_axis("grabh"), vg_get_axis("grabv") },
phys->grab, target );
}
}
phys->in_air = len==0?1:0;
+
+ if( !phys->in_air )
+ {
+ float const DOWNFORCE = -k_walk_downforce*VG_TIMESTEP_FIXED;
+ v3_muladds( phys->rb.v, (v3f){0.0f,-1.0f,0.0f}, DOWNFORCE, phys->rb.v );
+
+ if( vg_get_button("jump") )
+ {
+ phys->rb.v[1] = 5.0f;
+ }
+ }
v3_zero( phys->rb.w );
q_axis_angle( phys->rb.q, (v3f){0.0f,1.0f,0.0f}, -player.angles[0] );
v3_muladds( phys->rb.co, forward_dir, 2.0f, p1 );
vg_line( phys->rb.co, p1, 0xff0000ff );
- float move_dead = 0.1f,
- move = vg_get_axis("grabr")*0.5f + 0.5f - move_dead;
+ player.walk = powf( vg_get_axis("walk/push")*0.5f + 0.5f, 4.0f );
- if( move > 0.0f )
+ if( player.walk > 0.025f )
{
- float move_norm = move * (1.0f/(1.0f-move_dead)),
- speed = vg_lerpf( 0.1f*k_runspeed, k_runspeed, move_norm ),
- amt = k_walk_accel * ktimestep,
+ float
+ speed = vg_lerpf( 0.025f*k_runspeed, k_runspeed, player.walk ),
+ amt = k_walk_accel * VG_TIMESTEP_FIXED,
zvel = v3_dot( phys->rb.v, forward_dir ),
new_vel = vg_minf( zvel + amt, speed ),
diff = new_vel - vg_minf( zvel, speed );
- v3_muladds( phys->rb.v, forward_dir, diff, phys->rb.v );
-
- /* TODO move */
- float walk_norm = 30.0f/(float)player.mdl.anim_walk->length,
- run_norm = 30.0f/(float)player.mdl.anim_run->length ;
-
- player.walk_timer += ktimestep * vg_lerpf( walk_norm,run_norm,move_norm );
+ if( !phys->in_air )
+ {
+ v3_muladds( phys->rb.v, forward_dir, diff, phys->rb.v );
+ }
}
- else
+
+ if( !phys->in_air )
{
- player.walk_timer = 0.0f;
+ phys->rb.v[0] *= 1.0f - (VG_TIMESTEP_FIXED * k_walk_friction);
+ phys->rb.v[2] *= 1.0f - (VG_TIMESTEP_FIXED * k_walk_friction);
}
-
- phys->rb.v[0] *= 1.0f - (ktimestep*k_walk_friction);
- phys->rb.v[2] *= 1.0f - (ktimestep*k_walk_friction);
}
/*
}
}
- float grabt = vg_get_axis( "grabr" )*0.5f+0.5f;
+ float grabt = vg_get_axis( "grab" )*0.5f+0.5f;
phys->grab = vg_lerpf( phys->grab, grabt, 0.14f );
- player.pushing = 0.0f;
+ player.phys.pushing = 0.0f;
if( !phys->in_air )
{
if( angle < 0.999f )
{
v4f correction;
- q_axis_angle( correction, axis, acosf(angle)*0.3f );
+ q_axis_angle( correction, axis, acosf(angle)*18.0f*VG_TIMESTEP_FIXED );
q_mul( correction, phys->rb.q, phys->rb.q );
}
- v3_muladds( phys->rb.v, phys->rb.up,
- -k_downforce*ktimestep, phys->rb.v );
+ float const DOWNFORCE = -k_downforce*VG_TIMESTEP_FIXED;
+ v3_muladds( phys->rb.v, phys->rb.up, DOWNFORCE, phys->rb.v );
player_physics_control();
v3_muladds( phys->rb.v, jumpdir, force, phys->rb.v );
phys->jump = 0.0f;
- player.jump_time = vg_time;
+ player.jump_time = vg.time;
/* TODO: Move to audio file */
audio_lock();
if( !phys->jump_charge )
{
- phys->jump -= k_jump_charge_speed * ktimestep;
+ phys->jump -= k_jump_charge_speed * VG_TIMESTEP_FIXED;
}
+
phys->jump_charge = 0;
phys->jump = vg_clampf( phys->jump, 0.0f, 1.0f );
}
v3f prevco;
v3_copy( phys->rb.co, prevco );
- apply_gravity( phys->rb.v, ktimestep );
- v3_muladds( phys->rb.co, phys->rb.v, ktimestep, phys->rb.co );
+ apply_gravity( phys->rb.v, VG_TIMESTEP_FIXED );
+ v3_muladds( phys->rb.co, phys->rb.v, VG_TIMESTEP_FIXED, phys->rb.co );
/* Real angular velocity integration */
v3_lerp( phys->rb.w, (v3f){0.0f,0.0f,0.0f}, 0.125f, phys->rb.w );
view_vel = { 0.0f, 0.0f };
if( vg_get_button_down( "primary" ) )
- v2_copy( vg_mouse, mouse_last );
+ v2_copy( vg.mouse, mouse_last );
else if( vg_get_button( "primary" ) )
{
v2f delta;
- v2_sub( vg_mouse, mouse_last, delta );
- v2_copy( vg_mouse, mouse_last );
+ v2_sub( vg.mouse, mouse_last, delta );
+ v2_copy( vg.mouse, mouse_last );
- v2_muladds( view_vel, delta, 0.001f, view_vel );
+ v2_muladds( view_vel, delta, 0.06f*vg.time_delta, view_vel );
}
- v2_muladds( view_vel,
- (v2f){ vg_get_axis("h1"), vg_get_axis("v1") },
- 0.05f, view_vel );
- v2_muls( view_vel, 0.93f, view_vel );
+ v2_muladds( view_vel, (v2f){ vg_get_axis("h1"), vg_get_axis("v1") },
+ 3.0f * vg.time_delta, view_vel );
+
+ v2_muls( view_vel, 1.0f-4.2f*vg.time_delta, view_vel );
v2_add( view_vel, player.angles, player.angles );
player.angles[1] = vg_clampf( player.angles[1], -VG_PIf*0.5f, VG_PIf*0.5f );
}
static v3f move_vel = { 0.0f, 0.0f, 0.0f };
if( vg_get_button( "forward" ) )
- v3_muladds( move_vel, lookdir, ktimestep * movespeed, move_vel );
+ v3_muladds( move_vel, lookdir, VG_TIMESTEP_FIXED * movespeed, move_vel );
if( vg_get_button( "back" ) )
- v3_muladds( move_vel, lookdir, ktimestep *-movespeed, move_vel );
+ v3_muladds( move_vel, lookdir, VG_TIMESTEP_FIXED *-movespeed, move_vel );
if( vg_get_button( "left" ) )
- v3_muladds( move_vel, sidedir, ktimestep *-movespeed, move_vel );
+ v3_muladds( move_vel, sidedir, VG_TIMESTEP_FIXED *-movespeed, move_vel );
if( vg_get_button( "right" ) )
- v3_muladds( move_vel, sidedir, ktimestep * movespeed, move_vel );
+ v3_muladds( move_vel, sidedir, VG_TIMESTEP_FIXED * movespeed, move_vel );
v3_muls( move_vel, 0.7f, move_vel );
v3_add( move_vel, player.camera_pos, player.camera_pos );