adjust walkout anim length & masked anim blending
authorhgn <hgodden00@gmail.com>
Tue, 19 Dec 2023 04:04:24 +0000 (04:04 +0000)
committerhgn <hgodden00@gmail.com>
Tue, 19 Dec 2023 04:04:24 +0000 (04:04 +0000)
models_src/ch_none.mdl
player_walk.c
skeleton.h

index 14ed409115add210ca124ee475b121d3a739d8d6..5dacbe1085cbb8375cfc519e8d0a0641b2517d0f 100644 (file)
Binary files a/models_src/ch_none.mdl and b/models_src/ch_none.mdl differ
index eacdeeb2f4634ced916fd6528df10f0c0cba80c5..449b99e3a03bff9e0b63466123bcc2c5be4506c5 100644 (file)
@@ -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 );
index 868e62431b174e0975190521b5308aef458d485d..daa8fdcdab6418147062264d918c9fc94fee8cfe 100644 (file)
@@ -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