From: hgn Date: Sat, 16 Dec 2023 01:32:04 +0000 (+0000) Subject: revision to walk animation/system X-Git-Url: https://harrygodden.com/git/?p=carveJwlIkooP6JGAAIwe30JlM.git;a=commitdiff_plain;h=70824d9980277139b861021c7c3c94912ac56b72 revision to walk animation/system --- diff --git a/input.h b/input.h index 9d10fbd..2a19b40 100644 --- 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, diff --git a/models_src/ch_none.mdl b/models_src/ch_none.mdl index 1af0270..5178fbe 100644 Binary files a/models_src/ch_none.mdl and b/models_src/ch_none.mdl differ diff --git a/player_skate.c b/player_skate.c index 72c2096..708125c 100644 --- a/player_skate.c +++ b/player_skate.c @@ -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 ); 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 ); diff --git a/player_walk.h b/player_walk.h index 28e38a4..368e99c 100644 --- a/player_walk.h +++ b/player_walk.h @@ -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 );