X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=skeleton.h;h=ce71283b42d9e8c8878edb97285aeb547d450717;hb=46643f969b12c2144a5f15ac5509610f18b467e4;hp=e143fa2ec2038f34fb0d4fb5f890f10d568c8151;hpb=6a4dafa6fe9a3dd4bb88698bbe964154364390ec;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/skeleton.h b/skeleton.h index e143fa2..ce71283 100644 --- a/skeleton.h +++ b/skeleton.h @@ -1,3 +1,7 @@ +/* + * Copyright (C) Mount0 Software, Harry Godden - All Rights Reserved + */ + #ifndef SKELETON_H #define SKELETON_H @@ -14,6 +18,8 @@ struct skeleton int defer; mdl_keyframe kf; + + char name[16]; } *bones; m4x3f *final_mtx; @@ -42,12 +48,39 @@ struct skeleton useless cpu IK bones. */ }; +static u32 skeleton_bone_id( struct skeleton *skele, const char *name ) +{ + for( u32 i=0; ibone_count; i++ ) + { + if( !strcmp( skele->bones[i].name, name )) + return i; + } + return 0; +} + +static void keyframe_copy_pose( mdl_keyframe *kfa, mdl_keyframe *kfb, int num ) +{ + for( int i=0; i= 0.99f ) + { + keyframe_copy_pose( kfb, kfd, count ); + return; + } + for( int i=0; ilength-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, @@ -174,6 +221,9 @@ static void skeleton_inverse_for_ik( struct skeleton *skele, m3x3_transpose( inverse, inverse ); } +/* + * Creates inverse rotation matrices which the IK system uses. + */ static void skeleton_create_inverses( struct skeleton *skele ) { /* IK: inverse 'plane-bone space' axis '(^axis,^bone,...)[base] */ @@ -193,9 +243,11 @@ static void skeleton_create_inverses( struct skeleton *skele ) } } +/* + * Apply a model matrix to all bones, should be done last + */ static void skeleton_apply_transform( struct skeleton *skele, m4x3f transform ) { - /* bone space inverse matrix */ for( int i=0; ibone_count; i++ ) { struct skeleton_bone *sb = &skele->bones[i]; @@ -203,6 +255,10 @@ static 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 + */ static void skeleton_apply_inverses( struct skeleton *skele ) { for( int i=0; ibone_count; i++ ) @@ -295,6 +351,23 @@ 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 + */ +static void skeleton_apply_standard( struct skeleton *skele, mdl_keyframe *pose, + m4x3f transform ) +{ + skeleton_apply_pose( skele, pose, k_anim_apply_defer_ik ); + skeleton_apply_ik_pass( skele ); + skeleton_apply_pose( skele, pose, k_anim_apply_deffered_only ); + skeleton_apply_inverses( skele ); + skeleton_apply_transform( skele, transform ); +} + +/* + * Get an animation by name + */ static struct skeleton_anim *skeleton_get_anim( struct skeleton *skele, const char *name ) { @@ -360,6 +433,7 @@ static int skeleton_setup( struct skeleton *skele, mdl_header *mdl ) v3_copy( pnode->co, sb->co ); v3_copy( pnode->s, sb->end ); sb->parent = pnode->parent-skeleton_root; + strncpy( sb->name, mdl_pstr(mdl,pnode->pstr_name), 15 ); if( is_ik ) {