X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=skeleton.h;h=2be9a9aaff7ac7bd8945f9b5e37ed5d0ca0ff7ff;hb=1d06671f87a9d24596fc6808d8e0db889a818750;hp=0332a6051e02faaf0ce79ad6fb8ebeb4f8282a70;hpb=66b3ec9c538fefd79c2de08e0dcdf070b4331885;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/skeleton.h b/skeleton.h index 0332a60..2be9a9a 100644 --- a/skeleton.h +++ b/skeleton.h @@ -61,7 +61,7 @@ VG_STATIC u32 skeleton_bone_id( struct skeleton *skele, const char *name ) } vg_error( "skeleton_bone_id( *, \"%s\" );\n", name ); - vg_fatal_exit_loop( "Bone does not exist\n" ); + vg_fatal_error( "Bone does not exist\n" ); return 0; } @@ -134,13 +134,13 @@ VG_STATIC void skeleton_sample_anim( struct skeleton *skele, 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; @@ -165,7 +165,8 @@ typedef enum anim_apply { k_anim_apply_always, k_anim_apply_defer_ik, - k_anim_apply_deffered_only + k_anim_apply_deffered_only, + k_anim_apply_absolute } anim_apply; @@ -203,6 +204,18 @@ int should_apply_bone( struct skeleton *skele, u32 id, anim_apply type ) VG_STATIC void skeleton_apply_pose( struct skeleton *skele, mdl_keyframe *pose, anim_apply passtype ) { + if( passtype == k_anim_apply_absolute ){ + for( u32 i=1; ibone_count; i++ ){ + mdl_keyframe *kf = &pose[i-1]; + + v3f *posemtx = skele->final_mtx[i]; + + q_m3x3( kf->q, posemtx ); + v3_copy( kf->co, posemtx[3] ); + } + return; + } + m4x3_identity( skele->final_mtx[0] ); skele->bones[0].defer = 0; skele->bones[0].flags &= ~k_bone_flag_ik; @@ -233,6 +246,18 @@ 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, + mdl_keyframe *anim ){ + for( u32 i=1; ibone_count; i++ ){ + struct skeleton_bone *sb = &skele->bones[i]; + mdl_keyframe *kf = &anim[i-1]; + m4x3_decompose( skele->final_mtx[i], kf->co, kf->q, kf->s ); + } +} + /* * 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.. @@ -403,7 +428,7 @@ VG_STATIC struct skeleton_anim *skeleton_get_anim( struct skeleton *skele, } vg_error( "skeleton_get_anim( *, \"%s\" )\n", name ); - vg_fatal_exit_loop( "Invalid animation name\n" ); + vg_fatal_error( "Invalid animation name\n" ); return NULL; } @@ -437,11 +462,16 @@ VG_STATIC void skeleton_alloc_from( struct skeleton *skele, skele->ik = vg_linear_alloc( lin_alloc, ik_size ); skele->final_mtx = vg_linear_alloc( lin_alloc, mtx_size ); skele->anims = vg_linear_alloc( lin_alloc, anim_size ); + + memset( skele->bones, 0, bone_size ); + memset( skele->ik, 0, ik_size ); + memset( skele->final_mtx, 0, mtx_size ); + memset( skele->anims, 0, anim_size ); } VG_STATIC void skeleton_fatal_err(void) { - vg_fatal_exit_loop( "Skeleton setup failed" ); + vg_fatal_error( "Skeleton setup failed" ); } /* Setup an animated skeleton from model. mdl's metadata should stick around */ @@ -475,8 +505,6 @@ VG_STATIC void skeleton_setup( struct skeleton *skele, sb->collider = bone->collider; sb->orig_bone = bone; - vg_info( "orig: %u\n", bone->collider ); - if( sb->flags & k_bone_flag_ik ){ skele->bones[ sb->parent ].flags |= k_bone_flag_ik;