X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_walk.c;h=e359423035a97c23eb80aec6773d9851e9b12d84;hb=70824d9980277139b861021c7c3c94912ac56b72;hp=ec863b62abe3e17fa7c0121a12e9cb13f47cc022;hpb=23897aeb79caa65b4c19de6c2f20f05bf3d86114;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_walk.c b/player_walk.c index ec863b6..e359423 100644 --- a/player_walk.c +++ b/player_walk.c @@ -459,8 +459,6 @@ static void player__walk_update(void){ 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 */ @@ -517,7 +515,7 @@ static void player__walk_update(void){ } 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 ){ @@ -546,6 +544,10 @@ static void player__walk_update(void){ 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 @@ -752,22 +754,26 @@ static void player__walk_animate(void){ 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 ); @@ -873,20 +879,25 @@ static void player__walk_pose( void *_animator, player_pose *pose ){ 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 );