i hope your hapy
[carveJwlIkooP6JGAAIwe30JlM.git] / player_ragdoll.h
index 2bb0ae4220b1f7b3317f8b8dcbb490bdd58cdf96..3fd552471001449920d1fe49d589f5add73352d9 100644 (file)
@@ -42,8 +42,7 @@ VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
 {
    m4x3_identity( rp->collider_mtx );
 
-   if( bone->flags & k_bone_flag_collider_box )
-   {
+   if( bone->collider == k_bone_collider_box ){
       v3f delta;
       v3_sub( bone->hitbox[1], bone->hitbox[0], delta );
       v3_muls( delta, 0.5f, delta );
@@ -56,18 +55,15 @@ VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
       rp->rb.type = k_rb_shape_box;
       rp->colour = 0xffcccccc;
    }
-   else if( bone->flags & k_bone_flag_collider_capsule )
-   {
+   else if( bone->collider == k_bone_collider_capsule ){
       v3f v0, v1, tx, ty;
       v3_sub( bone->hitbox[1], bone->hitbox[0], v0 );
 
       int major_axis = 0;
       float largest = -1.0f;
 
-      for( int i=0; i<3; i ++ )
-      {
-         if( fabsf( v0[i] ) > largest )
-         {
+      for( int i=0; i<3; i ++ ){
+         if( fabsf( v0[i] ) > largest ){
             largest = fabsf( v0[i] );
             major_axis = i;
          }
@@ -133,14 +129,13 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
    rd->position_constraints_count = 0;
    rd->cone_constraints_count = 0;
 
-   for( u32 i=0; i<av->sk.bone_count; i ++ )
-   {
+   for( u32 i=0; i<av->sk.bone_count; i ++ ){
       struct skeleton_bone *bone = &av->sk.bones[i];
 
       /*
        * Bones with colliders
        */
-      if( !(bone->flags & k_bone_flag_collider_any) )
+      if( !(bone->collider) )
          continue;
 
       if( rd->part_count > vg_list_size(rd->parts) )
@@ -152,9 +147,6 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
 
       player_init_ragdoll_bone_collider( bone, rp );
       
-      struct mdl_node *pnode = mdl_node_from_id( &av->meta, bone->orig_node );
-      struct classtype_bone *inf = mdl_get_entdata( &av->meta, pnode );
-      
       /*
        * Bones with collider and parent
        */
@@ -163,27 +155,30 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
 
       rp->parent = ragdoll_bone_parent( rd, av, bone->parent );
       
-      /* Always assign a point-to-point constraint */
-      struct rb_constr_pos *c = 
-         &rd->position_constraints[ rd->position_constraints_count ++ ];
+      
+      if( bone->orig_bone->flags & k_bone_flag_cone_constraint ){
+         struct rb_constr_pos *c = 
+            &rd->position_constraints[ rd->position_constraints_count ++ ];
 
-      struct skeleton_bone *bj = &av->sk.bones[rp->bone_id];
-      struct ragdoll_part  *pp = &rd->parts[rp->parent];
-      struct skeleton_bone *bp = &av->sk.bones[pp->bone_id];
+         struct skeleton_bone *bj = &av->sk.bones[rp->bone_id];
+         struct ragdoll_part  *pp = &rd->parts[rp->parent];
+         struct skeleton_bone *bp = &av->sk.bones[pp->bone_id];
 
-      /* Convention: rba -- parent, rbb -- child */
-      c->rba = &pp->rb;
-      c->rbb = &rp->rb;
+         /* Convention: rba -- parent, rbb -- child */
+         c->rba = &pp->rb;
+         c->rbb = &rp->rb;
+
+         v3f delta;
+         v3_sub( bj->co, bp->co, delta );
+         m4x3_mulv( rp->inv_collider_mtx, (v3f){0.0f,0.0f,0.0f}, c->lcb );
+         m4x3_mulv( pp->inv_collider_mtx, delta, c->lca );
+
+
+         mdl_bone *inf = bone->orig_bone;
 
-      v3f delta;
-      v3_sub( bj->co, bp->co, delta );
-      m4x3_mulv( rp->inv_collider_mtx, (v3f){0.0f,0.0f,0.0f}, c->lcb );
-      m4x3_mulv( pp->inv_collider_mtx, delta, c->lca );
-      
-      if( inf->flags & k_bone_flag_cone_constraint )
-      {
          struct rb_constr_swingtwist *a = 
             &rd->cone_constraints[ rd->cone_constraints_count ++ ];
+
          a->rba = &pp->rb;
          a->rbb = &rp->rb;
          a->conet = cosf( inf->conet )-0.0001f;
@@ -216,8 +211,7 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
 VG_STATIC void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
                                             struct player_avatar *av )
 {
-   for( int i=0; i<rd->part_count; i++ )
-   {
+   for( int i=0; i<rd->part_count; i++ ){
       struct ragdoll_part *part = &rd->parts[i];
       m4x3f offset;
       m3x3_identity(offset);
@@ -235,8 +229,7 @@ VG_STATIC void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
                                             struct player_ragdoll *rd,
                                             v3f velocity )
 {
-   for( int i=0; i<rd->part_count; i++ )
-   {
+   for( int i=0; i<rd->part_count; i++ ){
       struct ragdoll_part *part = &rd->parts[i];
 
       v3f pos, offset;
@@ -274,25 +267,31 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd )
    int run_sim = 0;
    ragdoll_frame ++;
 
-   if( ragdoll_frame >= k_ragdoll_div )
-   {
+   if( ragdoll_frame >= k_ragdoll_div ){
       ragdoll_frame = 0;
       run_sim = 1;
    }
 
    rb_solver_reset();
-   for( int i=0; i<rd->part_count; i ++ )
-   {
-      if( rb_global_has_space() )
-      {
+   for( int i=0; i<rd->part_count; i ++ ){
+      if( rb_global_has_space() ){
          rb_ct *buf = rb_global_buffer();
 
-         int l = rb_capsule__scene(  rd->parts[i].rb.to_world,
-                                    &rd->parts[i].rb.inf.capsule,
-                                     NULL, &world->rb_geo.inf.scene, buf );
+         int l;
+         
+         if( rd->parts[i].rb.type == k_rb_shape_capsule ){
+            l = rb_capsule__scene( rd->parts[i].rb.to_world,
+                                   &rd->parts[i].rb.inf.capsule,
+                                   NULL, &world->rb_geo.inf.scene, buf );
+         }
+         else if( rd->parts[i].rb.type == k_rb_shape_box ){
+            l = rb_box__scene( rd->parts[i].rb.to_world,
+                               rd->parts[i].rb.bbx,
+                               NULL, &world->rb_geo.inf.scene, buf );
+         }
+         else continue;
 
-         for( int j=0; j<l; j++ )
-         {
+         for( int j=0; j<l; j++ ){
             buf[j].rba = &rd->parts[i].rb;
             buf[j].rbb = &world->rb_geo;
          }
@@ -302,42 +301,42 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd )
    }
 
    /* 
-    * COLLISION DETECTION
+    * self-collision
     */
-   for( int i=0; i<rd->part_count-1; i ++ )
-   {
-      for( int j=i+1; j<rd->part_count; j ++ )
-      {
-         if( rd->parts[j].parent != i )
-         {
-            if( rb_global_has_space() )
-            {
-               rb_ct *buf = rb_global_buffer();
-
-               int l = rb_capsule__capsule( rd->parts[i].rb.to_world,
-                                            &rd->parts[i].rb.inf.capsule,
-                                            rd->parts[j].rb.to_world,
-                                            &rd->parts[j].rb.inf.capsule,
-                                            buf );
-
-               for( int k=0; k<l; k++ )
-               {
-                  buf[k].rba = &rd->parts[i].rb;
-                  buf[k].rbb = &rd->parts[j].rb;
-               }
-
-               rb_contact_count += l;
+   for( int i=0; i<rd->part_count-1; i ++ ){
+      for( int j=i+1; j<rd->part_count; j ++ ){
+         if( rd->parts[j].parent != i ){
+            if( !rb_global_has_space() )
+               break;
+
+            if( rd->parts[j].rb.type != k_rb_shape_capsule )
+               continue;
+
+            if( rd->parts[i].rb.type != k_rb_shape_capsule )
+               continue;
+
+            rb_ct *buf = rb_global_buffer();
+
+            int l = rb_capsule__capsule( rd->parts[i].rb.to_world,
+                                         &rd->parts[i].rb.inf.capsule,
+                                         rd->parts[j].rb.to_world,
+                                         &rd->parts[j].rb.inf.capsule,
+                                         buf );
+
+            for( int k=0; k<l; k++ ){
+               buf[k].rba = &rd->parts[i].rb;
+               buf[k].rbb = &rd->parts[j].rb;
             }
+
+            rb_contact_count += l;
          }
       }
    }
 
-   for( int j=0; j<rd->part_count; j++ )
-   {
+   for( int j=0; j<rd->part_count; j++ ){
       struct ragdoll_part *pj = &rd->parts[j];
 
-      if( run_sim )
-      {
+      if( run_sim ){
          v4f plane = {0.0f,1.0f,0.0f,0.0f};
          rb_effect_simple_bouyency( &pj->rb, plane, k_ragdoll_floatyiness,
                                                     k_ragdoll_floatydrag );
@@ -354,14 +353,12 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd )
    /* 
     * DEBUG
     */
-   if( k_ragdoll_debug_collider )
-   {
+   if( k_ragdoll_debug_collider ){
       for( u32 i=0; i<rd->part_count; i ++ )
          rb_debug( &rd->parts[i].rb, rd->parts[i].colour );
    }
 
-   if( k_ragdoll_debug_constraints )
-   {
+   if( k_ragdoll_debug_constraints ){
       rb_debug_position_constraints( rd->position_constraints, 
                                      rd->position_constraints_count );
 
@@ -372,10 +369,8 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd )
    /*
     * SOLVE CONSTRAINTS 
     */
-   if( run_sim )
-   {
-      for( int i=0; i<25; i++ )
-      {
+   if( run_sim ){
+      for( int i=0; i<16; i++ ){
          rb_solve_contacts( rb_contact_buffer, rb_contact_count );
          rb_solve_swingtwist_constraints( rd->cone_constraints, 
                                           rd->cone_constraints_count );