X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=skeleton.h;h=ad87fd980dd7fd604e7a9c3f818fe0923fdc2328;hb=2383f834f7c7890b12fd4fee9387f4cd3ca3b1e0;hp=9f715efa0e8391127df9169051b984171024d59c;hpb=47941822dae18a018c985847b052e70214a3ccc6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/skeleton.h b/skeleton.h index 9f715ef..ad87fd9 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,6 +61,9 @@ 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; } @@ -155,7 +156,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 +187,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 +379,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 +389,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 +459,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 +482,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 +536,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 +573,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 ); }