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