save timing version in replay frame
[carveJwlIkooP6JGAAIwe30JlM.git] / skeleton.h
index a07a33af0e097de0f2c6d307f739be270422ba57..daa8fdcdab6418147062264d918c9fc94fee8cfe 100644 (file)
@@ -78,7 +78,7 @@ static void keyframe_copy_pose( mdl_keyframe *kfa, mdl_keyframe *kfb,
 
 /* apply a rotation from the perspective of root */
 static void keyframe_rotate_around( mdl_keyframe *kf, 
-                                       v3f origin, v3f offset, v4f q )
+                                    v3f origin, v3f offset, v4f q )
 {
    v3f v0, co;
    v3_add( kf->co, offset, co );
@@ -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 
@@ -212,6 +215,7 @@ static void skeleton_apply_pose( struct skeleton *skele, mdl_keyframe *pose,
          v3f *posemtx = final_mtx[i];
 
          q_m3x3( kf->q, posemtx );
+         m3x3_scale( posemtx, kf->s );
          v3_copy( kf->co, posemtx[3] );
       }
       return;
@@ -239,6 +243,7 @@ static void skeleton_apply_pose( struct skeleton *skele, mdl_keyframe *pose,
       /* pose matrix */
       mdl_keyframe *kf = &pose[i-1];
       q_m3x3( kf->q, posemtx );
+      m3x3_scale( posemtx, kf->s );
       v3_copy( kf->co, posemtx[3] );
       v3_add( temp_delta, posemtx[3], posemtx[3] );