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 );
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,