.......
[carveJwlIkooP6JGAAIwe30JlM.git] / skeleton.h
index 34e1b8e8fba779b0e9c2bb11ca1c068106d6eaee..ce71283b42d9e8c8878edb97285aeb547d450717 100644 (file)
@@ -58,12 +58,29 @@ static u32 skeleton_bone_id( struct skeleton *skele, const char *name )
    return 0;
 }
 
+static void keyframe_copy_pose( mdl_keyframe *kfa, mdl_keyframe *kfb, int num )
+{
+   for( int i=0; i<num; i++ )
+      kfb[i] = kfa[i];
+}
+
 /*
  * 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 )
 {
+   if( t <= 0.01f )
+   {
+      keyframe_copy_pose( kfa, kfd, count );
+      return;
+   }
+   else if( t >= 0.99f )
+   {
+      keyframe_copy_pose( kfb, kfd, count );
+      return;
+   }
+
    for( int i=0; i<count; i++ )
    {
       v3_lerp( kfa[i].co, kfb[i].co, t, kfd[i].co );
@@ -101,6 +118,20 @@ static void skeleton_sample_anim( struct skeleton *skele,
    skeleton_lerp_pose( skele, base, nbase, t, output );
 }
 
+static int skeleton_sample_anim_clamped( struct skeleton *skele,
+                                         struct skeleton_anim *anim,
+                                         float time,
+                                         mdl_keyframe *output )
+{
+   float end = (float)(anim->length-1) / anim->rate;
+   skeleton_sample_anim( skele, anim, vg_minf( end, time ), output );
+
+   if( time > end )
+      return 0;
+   else
+      return 1;
+}
+
 typedef enum anim_apply
 {
    k_anim_apply_always,