revision to walk animation/system
[carveJwlIkooP6JGAAIwe30JlM.git] / player_walk.c
index ec863b62abe3e17fa7c0121a12e9cb13f47cc022..e359423035a97c23eb80aec6773d9851e9b12d84 100644 (file)
@@ -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 );