revision to walk animation/system
[carveJwlIkooP6JGAAIwe30JlM.git] / player_walk.c
index 717411c88476cdd7bd56f74f060e186c22cd005a..e359423035a97c23eb80aec6773d9851e9b12d84 100644 (file)
@@ -435,7 +435,7 @@ static void player__walk_update(void){
          player__networked_sfx( k_player_subsystem_walk, 32, 
                                 k_player_walk_soundeffect_splash,
                                 localplayer.rb.co, 1.0f );
-         player__dead_transition();
+         player__dead_transition( k_player_die_type_generic );
          return;
       }
    }
@@ -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
@@ -711,20 +713,21 @@ static void player__walk_post_update(void){
       audio_lock();
       if( w->surface == k_surface_prop_concrete ){
          audio_oneshot_3d( 
-               &audio_footsteps[vg_randu32()%vg_list_size(audio_footsteps)], 
+               &audio_footsteps[vg_randu32(&vg.rand) % 
+                                 vg_list_size(audio_footsteps)], 
                localplayer.rb.co, 40.0f, 1.0f 
          );
       }
       else if( w->surface == k_surface_prop_grass ){
          audio_oneshot_3d( 
-           &audio_footsteps_grass[ vg_randu32()%
+           &audio_footsteps_grass[ vg_randu32(&vg.rand) %
                                     vg_list_size(audio_footsteps_grass)],
             localplayer.rb.co, 40.0f, 1.0f 
          );
       }
       else if( w->surface == k_surface_prop_wood ){
          audio_oneshot_3d( 
-           &audio_footsteps_wood[ vg_randu32()%
+           &audio_footsteps_wood[ vg_randu32(&vg.rand) %
                                     vg_list_size(audio_footsteps_wood)],
             localplayer.rb.co, 40.0f, 1.0f 
          );
@@ -751,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 );
@@ -872,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 );