a fairly major physics update
[carveJwlIkooP6JGAAIwe30JlM.git] / skeleton.h
index 9f715efa0e8391127df9169051b984171024d59c..4f35d58e25d50681b462cfac7596f3a8b02991da 100644 (file)
@@ -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;
@@ -155,7 +153,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 +184,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; i<skele->bone_count; i++ )
    {
@@ -454,18 +453,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 +476,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 +530,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 +567,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 );
          }