revision to walk animation/system
authorhgn <hgodden00@gmail.com>
Sat, 16 Dec 2023 01:32:04 +0000 (01:32 +0000)
committerhgn <hgodden00@gmail.com>
Sat, 16 Dec 2023 01:32:04 +0000 (01:32 +0000)
input.h
models_src/ch_none.mdl
player_skate.c
player_walk.c
player_walk.h

diff --git a/input.h b/input.h
index 9d10fbde79405df83ab8f96a7d3dbd95ca4edaa9..2a19b40e9b2c715424212ff5e3a7cc833ad59c39 100644 (file)
--- a/input.h
+++ b/input.h
@@ -36,6 +36,7 @@ enum sr_bind{
    k_srbind_home,
    k_srbind_lobby,
    k_srbind_chat,
+   k_srbind_run,
    
    k_srbind_miniworld_teleport,
    k_srbind_miniworld_resume,
@@ -106,6 +107,7 @@ static vg_input_op *input_button_list[] = {
 [k_srbind_sit]   = INPUT_BASIC( SDLK_z, SDL_CONTROLLER_BUTTON_B ),
 [k_srbind_lobby] = INPUT_BASIC( SDLK_TAB, SDL_CONTROLLER_BUTTON_DPAD_LEFT ),
 [k_srbind_chat ] = (vg_input_op[]){ vg_keyboard, SDLK_y, vg_end },
+[k_srbind_run ] = INPUT_BASIC( SDLK_LSHIFT, SDL_CONTROLLER_BUTTON_X ),
 
 [k_srbind_miniworld_resume]  = (vg_input_op[]){
    vg_keyboard, SDLK_RETURN, vg_gui_visible, 0,
index 1af0270ad6110f9df1985af8a3528a6430c985c4..5178fbe82f571702fdb2a74281741a85270d8b50 100644 (file)
Binary files a/models_src/ch_none.mdl and b/models_src/ch_none.mdl differ
index 72c20966bb051fa8ea919d33871001aa78e45e52..708125c632f51679b30121536923f9205c174270 100644 (file)
@@ -1284,7 +1284,8 @@ static void player__skate_post_update(void){
 
    audio_lock();
 
-   float air   = state->activity <= k_skate_activity_air_to_grind? 1.0f: 0.0f,
+   float air   = ((state->activity <= k_skate_activity_air_to_grind) ||
+                  (state->activity == k_skate_activity_handplant))? 1.0f: 0.0f,
          speed = v3_length( localplayer.rb.v ),
          attn  = vg_minf( 1.0f, speed*0.1f ),
          slide = vg_clampf( fabsf(state->slip), 0.0f, 1.0f );
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 );
index 28e38a4347825b18bd1c9670e53ea6a9c2b38f3a..368e99ce6f7b9cbfba908a1c2cdaf81b59412146 100644 (file)
@@ -80,12 +80,13 @@ enum player_walk_soundeffect {
 };
 
 static f32
-   k_walkspeed             = 10.0f,
+   k_walkspeed             = 3.0f,
+   k_runspeed              = 10.0f,
    k_airspeed              = 1.2f,
    k_stopspeed             = 4.0f,
    k_walk_accel            = 10.0f,
    k_walk_air_accel        = 7.0f,
-   k_walk_friction         = 10.0f,
+   k_walk_friction         = 6.0f,
    k_walk_step_height      = 0.2f,
 
    k_sit_yaw_limit         = VG_PIf/1.7f,
@@ -93,6 +94,7 @@ static f32
 
 static void player__walk_register(void){
    VG_VAR_F32( k_walkspeed,      flags=VG_VAR_CHEAT );
+   VG_VAR_F32( k_runspeed,       flags=VG_VAR_CHEAT );
    VG_VAR_F32( k_stopspeed,      flags=VG_VAR_CHEAT );
    VG_VAR_F32( k_airspeed,       flags=VG_VAR_CHEAT );
    VG_VAR_F32( k_walk_friction,  flags=VG_VAR_CHEAT );