From: hgn Date: Tue, 19 Dec 2023 04:04:24 +0000 (+0000) Subject: adjust walkout anim length & masked anim blending X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=ac8ece060a0947703b4a093ac0ddaaf321b04733;p=carveJwlIkooP6JGAAIwe30JlM.git adjust walkout anim length & masked anim blending --- diff --git a/models_src/ch_none.mdl b/models_src/ch_none.mdl index 14ed409..5dacbe1 100644 Binary files a/models_src/ch_none.mdl and b/models_src/ch_none.mdl differ diff --git a/player_walk.c b/player_walk.c index eacdeeb..449b99e 100644 --- a/player_walk.c +++ b/player_walk.c @@ -932,7 +932,7 @@ enum walk_transition_type { static void player_walk_pose_transition( struct player_walk_animator *animator, struct skeleton_anim *anim, enum walk_transition_type type, - mdl_keyframe apose[32], player_pose *pose ){ + mdl_keyframe apose[32], f32 *mask, player_pose *pose ){ mdl_keyframe bpose[32]; @@ -961,7 +961,12 @@ static void player_walk_pose_transition( q_mul( kf_board->q, qyaw, kf_board->q ); q_normalize( kf_board->q ); - skeleton_lerp_pose( sk, apose, bpose, blend, pose->keyframes ); + if( mask ){ + for( i32 i=0; ibone_count-1; i ++ ) + keyframe_lerp( apose+i, bpose+i, blend*mask[i], pose->keyframes+i ); + } + else + skeleton_lerp_pose( sk, apose, bpose, blend, pose->keyframes ); } static void player__walk_pose( void *_animator, player_pose *pose ){ @@ -1018,19 +1023,42 @@ static void player__walk_pose( void *_animator, player_pose *pose ){ } else if( animator->activity == k_walk_activity_odrop_in ){ player_walk_pose_transition( - animator, w->anim_drop_in, k_walk_transition_out, apose, pose ); + animator, w->anim_drop_in, k_walk_transition_out, apose, + NULL, pose ); } else if( animator->activity == k_walk_activity_oair ){ player_walk_pose_transition( - animator, w->anim_jump_to_air, k_walk_transition_out, apose, pose ); + animator, w->anim_jump_to_air, k_walk_transition_out, apose, + NULL, pose ); } else if( animator->activity == k_walk_activity_oregular ){ player_walk_pose_transition( - animator, w->anim_intro, k_walk_transition_out, apose, pose ); + animator, w->anim_intro, k_walk_transition_out, apose, + NULL, pose ); } else if( animator->activity == k_walk_activity_ipopoff ){ - player_walk_pose_transition( - animator, w->anim_popoff, k_walk_transition_in, apose, pose ); + + if( animator->run > 0.2f ){ + f32 t = 1.0f-vg_minf( animator->run-0.2f, 1.0f ), + mask[ 32 ]; + + for( u32 i=0; i<32; i ++ ) + mask[i] = 1.0f; + + mask[ localplayer.id_ik_foot_l-1 ] = t; + mask[ localplayer.id_ik_foot_r-1 ] = t; + mask[ localplayer.id_ik_knee_l-1 ] = t; + mask[ localplayer.id_ik_knee_r-1 ] = t; + mask[ localplayer.id_hip-1 ] = t; + player_walk_pose_transition( + animator, w->anim_popoff, k_walk_transition_in, apose, + mask, pose ); + } + else{ + player_walk_pose_transition( + animator, w->anim_popoff, k_walk_transition_in, apose, + NULL, pose ); + } } else { skeleton_copy_pose( sk, apose, pose->keyframes ); diff --git a/skeleton.h b/skeleton.h index 868e624..daa8fdc 100644 --- a/skeleton.h +++ b/skeleton.h @@ -91,12 +91,18 @@ static void keyframe_rotate_around( mdl_keyframe *kf, q_normalize( kf->q ); } +static void keyframe_lerp( mdl_keyframe *kfa, mdl_keyframe *kfb, f32 t, + mdl_keyframe *kfd ){ + v3_lerp( kfa->co, kfb->co, t, kfd->co ); + q_nlerp( kfa->q, kfb->q, t, kfd->q ); + v3_lerp( kfa->s, kfb->s, t, kfd->s ); +} + /* * Lerp between two sets of keyframes and store in dest. Rotations use Nlerp. */ static void keyframe_lerp_pose( mdl_keyframe *kfa, mdl_keyframe *kfb, - float t, mdl_keyframe *kfd, int count ) -{ + float t, mdl_keyframe *kfd, int count ){ if( t <= 0.0001f ){ keyframe_copy_pose( kfa, kfd, count ); return; @@ -106,11 +112,8 @@ static void keyframe_lerp_pose( mdl_keyframe *kfa, mdl_keyframe *kfb, return; } - for( int i=0; i