From ac8ece060a0947703b4a093ac0ddaaf321b04733 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 19 Dec 2023 04:04:24 +0000 Subject: [PATCH] adjust walkout anim length & masked anim blending --- models_src/ch_none.mdl | Bin 1046216 -> 1040016 bytes player_walk.c | 42 ++++++++++++++++++++++++++++++++++------- skeleton.h | 17 ++++++++++------- 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/models_src/ch_none.mdl b/models_src/ch_none.mdl index 14ed409115add210ca124ee475b121d3a739d8d6..5dacbe1085cbb8375cfc519e8d0a0641b2517d0f 100644 GIT binary patch delta 473 zcmYk2O(+Cm9LArSU0=(Xtz~2m+bW6L*wXA_lQmo%mSourlCmy#E^<+{;;;^inu~Ho z?NMR2lyaaHSEcrfi`1Ot=$X9By!Gqt_x_*%`}OddKD%!G8V4oflZgc}j zbXE9H4{%CXglBnyOFCm5uKC^v-1+)P`++CA*uQ8VB!Cw#ghj*EAn;1}9^!3qW&q#5 z`c{hBz<=Hv0%G)9eqk7h``j1{c->GcCxfJp)DzDeNfQZ?X3|0w(po7e)!6M1 DW@ckA delta 4843 zcmeHK{clrM7=GJ*7FIW4jBa720?OQ0(zR&V+`YFQzYsoT#0`uzQc&j1iW|sBAd_Ap zN|!8JR+3JPVWN(yXx83tGpsEofq;nGL?;Hs3>-gbGPwzJA8~d*r*zss!5?muCnwK+ zpZmP$ea}6;=X%1z)ls20T~%~#8&L@n?S9F*y=m8>hP^v>?*gT@uX^>WBK2y?TZN(V zfwV<6zCe}l-MDa(tD%T!pPDG22}!o`ONc~pTu$&$A0=uBUy$Un(Qkb^yfX?`vFd{R!(t0TSgnKyPS+m2hhfeV>L zXE9n>$|mQa`N7RK70iZNK7^y^=xd$trIU#DNnBe|eCrE~{N?Y)R9yx|&&s#s?=qdQ zeVKZ(&-$dc#C7M6uG-z#6|QaH%Kx?J5G-qvs#HQJ&1}YMSdL+o-@L{bKR?Vxd$M@@ zL<38W)$9&p#R5#jz|s|-TrGvF6$Kiv3R73mLE@;CN$@_)WqpG^EK zo>^1yKH{trmfZ5aHaL-4A}qdGDD^F~LFbT&bnxqxCJ|?o%z*Dnd2=ZHleyt_x-owJ z4F`0M61hl+q%m_h1RRhF49Z+&@SD%M%Z1;Desdp&a1{(a0dgD*wjq8m&blHBy5hI} z#^>oI_HBnRV(pB=tb!#(3b&Cf+bGkI(o}jMTI>3r*2_^StjqGsVYU zepl++y+Gn)dR26JoCvK+v(J;(tW2zNNA>IB`>&h{pX267PUW>i zm}AawGQrU5pM8c|tDE*=fp7Q+As2PE+1#$~#RtJ>tZm xoF0|aqjGvwzSETNwExj}+VK{BI*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