v3f forward_dir = { -sinf(yaw), 0.0f, cosf(yaw) };
v3f right_dir = { forward_dir[2], 0.0f, -forward_dir[0] };
- w->move_speed = localplayer.immobile? 0.0f: v2_length( steer );
-
/*
* Collision detection
*/
}
accel_speed = k_walk_accel;
- nominal_speed = k_walkspeed;
+ nominal_speed = button_press(k_srbind_run)? k_runspeed: k_walkspeed;
/* jump */
if( w->state.jump_queued ){
nominal_speed, accel_speed );
v3_normalize( movedir );
}
+
+ w->move_speed = vg_minf( v2_length( (v2f){ localplayer.rb.v[0],
+ localplayer.rb.v[2] } ),
+ k_runspeed );
/*
* Resolve velocity constraints
animator->fly = vg_lerpf( animator->fly, fly, rate*vg.time_delta );
animator->run = vg_lerpf( animator->run, w->move_speed,
- 2.0f*vg.time_delta);
+ 8.0f*vg.time_delta);
}
- if( w->move_speed > 0.025f ){
- /* TODO move */
- float walk_norm = 30.0f/(float)w->anim_walk->length,
- run_norm = 30.0f/(float)w->anim_run->length,
- walk_adv = vg_lerpf( walk_norm, run_norm, w->move_speed );
+ if( animator->run > 0.025f ){
+ f32 walk_norm = 30.0f/(float)w->anim_walk->length,
+ run_norm = 30.0f/(float)w->anim_run->length,
+ l;
- w->state.walk_timer += walk_adv * vg.time_delta;
+ if( animator->run <= k_walkspeed )
+ l = (animator->run / k_walkspeed) * walk_norm;
+ else {
+ l = vg_lerpf( walk_norm, run_norm,
+ (animator->run-k_walkspeed) / (k_runspeed-k_walkspeed) );
+ }
+ w->state.walk_timer += l * vg.time_delta;
}
else
w->state.walk_timer = 0.0f;
animator->walk_timer = w->state.walk_timer;
-
if( localplayer.immobile || (w->state.outro_type == k_walk_outro_drop_in) ){
v3_copy( localplayer.rb.co, animator->root_co );
v4_copy( localplayer.rb.q, animator->root_q );
float walk_norm = (float)w->anim_walk->length/30.0f,
run_norm = (float)w->anim_run->length/30.0f,
- t = animator->walk_timer,
- l = vg_clampf( animator->run*15.0f, 0.0f, 1.0f ),
- idle_walk = vg_clampf( (animator->run-0.1f)/(1.0f-0.1f), 0.0f, 1.0f );
+ t = animator->walk_timer;
/* walk/run */
mdl_keyframe apose[32], bpose[32];
- skeleton_sample_anim( sk, w->anim_walk, t*walk_norm, apose );
- skeleton_sample_anim( sk, w->anim_run, t*run_norm, bpose );
-
- skeleton_lerp_pose( sk, apose, bpose, l, apose );
+ if( animator->run <= k_walkspeed ){
+ /* walk / idle */
+ f32 l = vg_minf( 1, (animator->run/k_walkspeed)*6.0f );
+ skeleton_sample_anim( sk, w->anim_idle, vg.time*0.1f, apose );
+ skeleton_sample_anim( sk, w->anim_walk, t*walk_norm, bpose );
+ skeleton_lerp_pose( sk, apose, bpose, l, apose );
+ }
+ else {
+ /* walk / run */
+ f32 l = (animator->run-k_walkspeed) / (k_runspeed-k_walkspeed);
+ skeleton_sample_anim( sk, w->anim_walk, t*walk_norm, apose );
+ skeleton_sample_anim( sk, w->anim_run, t*run_norm, bpose );
+ skeleton_lerp_pose( sk, apose, bpose, l, apose );
+ }
- /* idle */
- skeleton_sample_anim( sk, w->anim_idle, vg.time*0.1f, bpose );
- skeleton_lerp_pose( sk, apose, bpose, 1.0f-idle_walk, apose );
/* air */
skeleton_sample_anim( sk, w->anim_jump, vg.time*0.6f, bpose );