From ac8ece060a0947703b4a093ac0ddaaf321b04733 Mon Sep 17 00:00:00 2001 From: hgn <hgodden00@gmail.com> 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<ev2PJ)A4(J77Ef*G7^BXH` zOIDtWaL$fOx{PBx#VJv}$Vp!jNwp{1JBp8;z`6{yc|o}5Nfg+o>%!G8V4oflZgc}j zbXE9H4{%CXglBnyOFCm5uKC^v-1+)P`++CA*uQ8VB!Cw#ghj*EAn;1}9^!3qW&q#5 z`c{hBz<=Hv0%G)9eqk7h``j1<MtrV}0~z}7c{8s0mI3Df7F_dr5-9lmehS#6hiVs` z2KIdQk1T(L9vAiM?5?Ag98DrJ2~->{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<wTv}xk+BUg6Jb~ zZIb_i2?W6*!%w!oQA%_v<^J0%iLQeu{av=w3ZkEIAuoAD?JA-Xa8?L2us%gJnG)AM z4Q<+g`fQHK06wdq<cZ2tcx(-kHHG)ACE5V~FkhW)6E_ms|GgmFS~d|mQ@CR@Q7ibI z*$F;N<W7mdRfmp%mnY)~wjAp(INo2N0@Og-Kz~8{`7EDxNRy{h`##WU7x@~8G(S9n zMhi1DE<uH{X8IZa>(Qkb^yfX?`vFd{R!(t0TSg<XtzYqJzI$#>nKyPS+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|-TrGvF<cM=+Utq`lozNNJC;9;s(@eo@9C)WnjOg2nT-D8k zMsC0FAcQ6etpTDj3rjo={0*RNBsy%y2(bE?Mg$xZ)5HO$UvHca4d2}sxhyZNK0U$; zVM$9YBo43%FrLst55KP7_>6$Kiv<W~R*1ToaiWR|7&>3R73mLE@;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#<HP`BYS`04|>^>oI_HBnRV(pB=tb!#(3b&Cf+bGkI(o}jMTI>3r*2_^StjqGsVYU zepl++y+Gn)dR26JoCvK+v<!*ufZNgvz78k^CLdoKs;`T4Q#X%9PTbv(#2#p(tPm*+ z@tsJ@d~4+G(h{MgV&vlq{z@*ZxC0X$M*E}w>(J;(tW2zNNA>IB`>&h{pX267PUW>i zm}AawGQrU5pM8c|tDE<Ejrb1;9Q`q;*Jm$Nmn%C>*=fp7Q+As2PE+1#$~#RtJ>tZm xoF0|aqjGvwzSETNwExj}+VK{BI*<Wm0$D&dpaJFpbAcQ{3p_H=qR%x%{{iUH${_#% 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; i<sk->bone_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<count; i++ ){ - v3_lerp( kfa[i].co, kfb[i].co, t, kfd[i].co ); - q_nlerp( kfa[i].q, kfb[i].q, t, kfd[i].q ); - v3_lerp( kfa[i].s, kfb[i].s, t, kfd[i].s ); - } + for( int i=0; i<count; i++ ) + keyframe_lerp( kfa+i, kfb+i, t, kfd+i ); } static -- 2.25.1