X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=skeleton.h;h=c5f59da39fcc31ab581e1e2396c73351b28bb863;hb=343d594b37f42a94f220a5089c9db36da9da3ab4;hp=9f715efa0e8391127df9169051b984171024d59c;hpb=47941822dae18a018c985847b052e70214a3ccc6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/skeleton.h b/skeleton.h index 9f715ef..c5f59da 100644 --- a/skeleton.h +++ b/skeleton.h @@ -14,16 +14,14 @@ struct skeleton v3f co, end; u32 parent; - int deform, ik; + u32 flags; int defer; mdl_keyframe kf; u32 orig_node; - int collider; boxf hitbox; - const char *name; } *bones; @@ -63,10 +61,14 @@ VG_STATIC u32 skeleton_bone_id( struct skeleton *skele, const char *name ) return i; } + vg_error( "skeleton_bone_id( *, \"%s\" );\n", name ); + vg_fatal_exit_loop( "Bone does not exist\n" ); + return 0; } -VG_STATIC void keyframe_copy_pose( mdl_keyframe *kfa, mdl_keyframe *kfb, int num ) +VG_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, + mdl_keyframe *kfa, mdl_keyframe *kfd ) +{ + keyframe_copy_pose( kfa, kfd, skele->bone_count-1 ); +} + /* * Sample animation between 2 closest frames using time value. Output is a * keyframe buffer that is allocated with an appropriate size @@ -155,7 +163,8 @@ VG_STATIC int should_apply_bone( struct skeleton *skele, u32 id, anim_apply type if( type == k_anim_apply_defer_ik ) { - if( (sp->ik && !sb->ik) || sp->defer ) + if( ((sp->flags & k_bone_flag_ik) && !(sb->flags & k_bone_flag_ik)) + || sp->defer ) { sb->defer = 1; return 0; @@ -185,7 +194,7 @@ VG_STATIC void skeleton_apply_pose( struct skeleton *skele, mdl_keyframe *pose, { m4x3_identity( skele->final_mtx[0] ); skele->bones[0].defer = 0; - skele->bones[0].ik = 0; + skele->bones[0].flags &= ~k_bone_flag_ik; for( int i=1; ibone_count; i++ ) { @@ -377,7 +386,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, - const char *name ) + const char *name ) { for( int i=0; ianim_count; i++ ) { @@ -387,6 +396,9 @@ VG_STATIC struct skeleton_anim *skeleton_get_anim( struct skeleton *skele, return anim; } + vg_error( "skeleton_get_anim( *, \"%s\" )\n", name ); + vg_fatal_exit_loop( "Invalid animation name\n" ); + return NULL; } @@ -454,18 +466,16 @@ VG_STATIC void skeleton_setup( struct skeleton *skele, struct skeleton_bone *sb = &skele->bones[bone_count]; struct classtype_bone *bone_inf = mdl_get_entdata( mdl, pnode ); - int is_ik = bone_inf->ik_target; v3_copy( pnode->co, sb->co ); v3_copy( pnode->s, sb->end ); sb->parent = pnode->parent-skeleton_root; sb->name = mdl_pstr( mdl, pnode->pstr_name ); - sb->deform = bone_inf->deform; + sb->flags = bone_inf->flags; - if( is_ik ) + if( sb->flags & k_bone_flag_ik ) { - sb->ik = 1; /* TODO: place into new IK array */ - skele->bones[ sb->parent ].ik = 1; + skele->bones[ sb->parent ].flags |= k_bone_flag_ik; if( ik_count == skele->ik_count ) { @@ -479,16 +489,11 @@ VG_STATIC void skeleton_setup( struct skeleton *skele, ik->target = bone_inf->ik_target; ik->pole = bone_inf->ik_pole; } - else - { - sb->ik = 0; - } - sb->collider = bone_inf->collider; sb->orig_node = i; box_copy( bone_inf->hitbox, sb->hitbox ); - if( bone_inf->collider ) + if( bone_inf->flags & k_bone_flag_collider_any ) { if( collider_count == skele->collider_count ) { @@ -538,7 +543,7 @@ VG_STATIC void skeleton_setup( struct skeleton *skele, v3_zero( skele->bones[0].co ); v3_copy( (v3f){0.0f,1.0f,0.0f}, skele->bones[0].end ); skele->bones[0].parent = 0xffffffff; - skele->bones[0].collider = 0; + skele->bones[0].flags = 0; skele->bones[0].name = "[root]"; /* process animation quick refs */ @@ -575,9 +580,9 @@ VG_STATIC void skeleton_debug( struct skeleton *skele ) m4x3_mulv( skele->final_mtx[i], p0, p0 ); m4x3_mulv( skele->final_mtx[i], p1, p1 ); - if( sb->deform ) + if( sb->flags & k_bone_flag_deform ) { - if( sb->ik ) + if( sb->flags & k_bone_flag_ik ) { vg_line( p0, p1, 0xff0000ff ); }