X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=skeleton.h;h=6791d1c3f43693c624ea708cf05c29316957869b;hb=46f4e9ee87dc67402166e4c6b05efbe922cd7574;hp=dc506abdde0df3b0908dcbddc4c5ccd7e6712d88;hpb=b615f03b922d155f9449d2a23d3cc18eed320ed3;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/skeleton.h b/skeleton.h index dc506ab..6791d1c 100644 --- a/skeleton.h +++ b/skeleton.h @@ -53,7 +53,7 @@ struct skeleton bindable_count; }; -VG_STATIC u32 skeleton_bone_id( struct skeleton *skele, const char *name ) +static u32 skeleton_bone_id( struct skeleton *skele, const char *name ) { for( u32 i=1; ibone_count; i++ ){ if( !strcmp( skele->bones[i].name, name )) @@ -66,7 +66,7 @@ VG_STATIC u32 skeleton_bone_id( struct skeleton *skele, const char *name ) return 0; } -VG_STATIC void keyframe_copy_pose( mdl_keyframe *kfa, mdl_keyframe *kfb, +static void keyframe_copy_pose( mdl_keyframe *kfa, mdl_keyframe *kfb, int num ) { for( int i=0; ibone_count-1 ); } -VG_STATIC void skeleton_copy_pose( struct skeleton *skele, +static void skeleton_copy_pose( struct skeleton *skele, mdl_keyframe *kfa, mdl_keyframe *kfd ) { keyframe_copy_pose( kfa, kfd, skele->bone_count-1 ); @@ -129,25 +129,25 @@ VG_STATIC void skeleton_copy_pose( struct skeleton *skele, * Sample animation between 2 closest frames using time value. Output is a * keyframe buffer that is allocated with an appropriate size */ -VG_STATIC void skeleton_sample_anim( struct skeleton *skele, +static void skeleton_sample_anim( struct skeleton *skele, struct skeleton_anim *anim, float time, mdl_keyframe *output ) { - float animtime = time*anim->rate; + f32 animtime = fmodf( time*anim->rate, anim->length ), + animframe = floorf( animtime ), + t = animtime - animframe; - u32 frame = ((u32)animtime) % anim->length, + u32 frame = (u32)animframe % anim->length, next = (frame+1) % anim->length; - float t = vg_fractf( animtime ); - mdl_keyframe *base = anim->anim_data + (skele->bone_count-1)*frame, *nbase = anim->anim_data + (skele->bone_count-1)*next; skeleton_lerp_pose( skele, base, nbase, t, output ); } -VG_STATIC int skeleton_sample_anim_clamped( struct skeleton *skele, +static int skeleton_sample_anim_clamped( struct skeleton *skele, struct skeleton_anim *anim, float time, mdl_keyframe *output ) @@ -170,7 +170,7 @@ typedef enum anim_apply } anim_apply; -VG_STATIC +static int should_apply_bone( struct skeleton *skele, u32 id, anim_apply type ) { struct skeleton_bone *sb = &skele->bones[ id ], @@ -201,7 +201,7 @@ int should_apply_bone( struct skeleton *skele, u32 id, anim_apply type ) /* * Apply block of keyframes to skeletons final pose */ -VG_STATIC void skeleton_apply_pose( struct skeleton *skele, mdl_keyframe *pose, +static void skeleton_apply_pose( struct skeleton *skele, mdl_keyframe *pose, anim_apply passtype ) { if( passtype == k_anim_apply_absolute ){ @@ -249,7 +249,7 @@ VG_STATIC void skeleton_apply_pose( struct skeleton *skele, mdl_keyframe *pose, /* * Take the final matrices and decompose it into an absolute positioned anim */ -VG_STATIC void skeleton_decompose_mtx_absolute( struct skeleton *skele, +static void skeleton_decompose_mtx_absolute( struct skeleton *skele, mdl_keyframe *anim ){ for( u32 i=1; ibone_count; i++ ){ struct skeleton_bone *sb = &skele->bones[i]; @@ -262,7 +262,7 @@ VG_STATIC void skeleton_decompose_mtx_absolute( struct skeleton *skele, * creates the reference inverse matrix for an IK bone, as it has an initial * intrisic rotation based on the direction that the IK is setup.. */ -VG_STATIC void skeleton_inverse_for_ik( struct skeleton *skele, +static void skeleton_inverse_for_ik( struct skeleton *skele, v3f ivaxis, u32 id, m3x3f inverse ) { @@ -276,7 +276,7 @@ VG_STATIC void skeleton_inverse_for_ik( struct skeleton *skele, /* * Creates inverse rotation matrices which the IK system uses. */ -VG_STATIC void skeleton_create_inverses( struct skeleton *skele ) +static void skeleton_create_inverses( struct skeleton *skele ) { /* IK: inverse 'plane-bone space' axis '(^axis,^bone,...)[base] */ for( u32 i=0; iik_count; i++ ){ @@ -297,7 +297,7 @@ VG_STATIC void skeleton_create_inverses( struct skeleton *skele ) /* * Apply a model matrix to all bones, should be done last */ -VG_STATIC +static void skeleton_apply_transform( struct skeleton *skele, m4x3f transform ) { for( u32 i=0; ibone_count; i++ ){ @@ -310,7 +310,7 @@ void skeleton_apply_transform( struct skeleton *skele, m4x3f transform ) * Apply an inverse matrix to all bones which maps vertices from bind space into * bone relative positions */ -VG_STATIC void skeleton_apply_inverses( struct skeleton *skele ) +static void skeleton_apply_inverses( struct skeleton *skele ) { for( u32 i=0; ibone_count; i++ ){ struct skeleton_bone *sb = &skele->bones[i]; @@ -325,7 +325,7 @@ VG_STATIC void skeleton_apply_inverses( struct skeleton *skele ) /* * Apply all IK modifiers (2 bone ik reference from blender is supported) */ -VG_STATIC void skeleton_apply_ik_pass( struct skeleton *skele ) +static void skeleton_apply_ik_pass( struct skeleton *skele ) { for( u32 i=0; iik_count; i++ ){ struct skeleton_ik *ik = &skele->ik[i]; @@ -404,7 +404,7 @@ VG_STATIC void skeleton_apply_ik_pass( struct skeleton *skele ) * Applies the typical operations that you want for an IK rig: * Pose, IK, Pose(deferred), Inverses, Transform */ -VG_STATIC void skeleton_apply_standard( struct skeleton *skele, mdl_keyframe *pose, +static void skeleton_apply_standard( struct skeleton *skele, mdl_keyframe *pose, m4x3f transform ) { skeleton_apply_pose( skele, pose, k_anim_apply_defer_ik ); @@ -417,7 +417,7 @@ VG_STATIC void skeleton_apply_standard( struct skeleton *skele, mdl_keyframe *po /* * Get an animation by name */ -VG_STATIC struct skeleton_anim *skeleton_get_anim( struct skeleton *skele, +static struct skeleton_anim *skeleton_get_anim( struct skeleton *skele, const char *name ) { for( u32 i=0; ianim_count; i++ ){ @@ -433,7 +433,7 @@ VG_STATIC struct skeleton_anim *skeleton_get_anim( struct skeleton *skele, return NULL; } -VG_STATIC void skeleton_alloc_from( struct skeleton *skele, +static void skeleton_alloc_from( struct skeleton *skele, void *lin_alloc, mdl_context *mdl, mdl_armature *armature ) @@ -469,13 +469,13 @@ VG_STATIC void skeleton_alloc_from( struct skeleton *skele, memset( skele->anims, 0, anim_size ); } -VG_STATIC void skeleton_fatal_err(void) +static void skeleton_fatal_err(void) { vg_fatal_error( "Skeleton setup failed" ); } /* Setup an animated skeleton from model. mdl's metadata should stick around */ -VG_STATIC void skeleton_setup( struct skeleton *skele, +static void skeleton_setup( struct skeleton *skele, void *lin_alloc, mdl_context *mdl ) { u32 ik_count = 0, collider_count = 0; @@ -560,7 +560,7 @@ VG_STATIC void skeleton_setup( struct skeleton *skele, vg_success( " %u colliders\n", skele->collider_count ); } -VG_STATIC void skeleton_debug( struct skeleton *skele ) +static void skeleton_debug( struct skeleton *skele ) { for( u32 i=1; ibone_count; i ++ ){ struct skeleton_bone *sb = &skele->bones[i];