small compression
[carveJwlIkooP6JGAAIwe30JlM.git] / player_ragdoll.c
index aabf6f9fe37eefdb1e545b61b93f8777a1654a53..d5029dd72865edc08759f826d370587e6a10ac32 100644 (file)
@@ -4,7 +4,7 @@
 #include "player.h"
 #include "audio.h"
 
-VG_STATIC void player_ragdoll_init(void)
+static void player_ragdoll_init(void)
 {
    VG_VAR_F32( k_ragdoll_limit_scale );
    VG_VAR_I32( k_ragdoll_div );
@@ -12,7 +12,7 @@ VG_STATIC void player_ragdoll_init(void)
    VG_VAR_I32( k_ragdoll_debug_constraints );
 }
 
-VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
+static void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
                                                   struct ragdoll_part *rp )
 {
    m4x3_identity( rp->collider_mtx );
@@ -46,7 +46,7 @@ VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
       
       v3_zero( v1 );
       v1[ major_axis ] = 1.0f;
-      rb_tangent_basis( v1, tx, ty );
+      v3_tangent_basis( v1, tx, ty );
       
       float r = (fabsf(v3_dot(tx,v0)) + fabsf(v3_dot(ty,v0))) * 0.25f,
             l = fabsf(v0[ major_axis ]);
@@ -82,7 +82,7 @@ VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
 /*
  * Get parent index in the ragdoll
  */
-VG_STATIC u32 ragdoll_bone_parent( struct player_ragdoll *rd,
+static u32 ragdoll_bone_parent( struct player_ragdoll *rd,
                                    struct player_avatar *av, u32 bone_id )
 {
    for( u32 j=0; j<rd->part_count; j++ )
@@ -96,7 +96,7 @@ VG_STATIC u32 ragdoll_bone_parent( struct player_ragdoll *rd,
 /*
  * Setup ragdoll colliders 
  */
-VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
+static void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
                                                  struct player_avatar *av )
 {
    rd->part_count = 0;
@@ -186,7 +186,7 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
 /*
  * Make avatar copy the ragdoll
  */
-VG_STATIC void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
+static void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
                                             struct player_avatar *av )
 {
    for( int i=0; i<rd->part_count; i++ ){
@@ -204,7 +204,8 @@ VG_STATIC void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
       q_m3x3( q_int, mtx );
       v3_copy( co_int, mtx[3] );
 
-      m4x3_mul( mtx, part->inv_collider_mtx, av->sk.final_mtx[part->bone_id] );
+      m4x3_mul( mtx, part->inv_collider_mtx, 
+                localplayer.final_mtx[part->bone_id] );
    }
 
    for( u32 i=1; i<av->sk.bone_count; i++ ){
@@ -219,17 +220,18 @@ VG_STATIC void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
          v3_copy( delta, posemtx[3] );
 
          /* final matrix */
-         m4x3_mul( av->sk.final_mtx[sb->parent], posemtx, av->sk.final_mtx[i] );
+         m4x3_mul( localplayer.final_mtx[sb->parent], posemtx, 
+                   localplayer.final_mtx[i] );
       }
    }
 
-   skeleton_apply_inverses( &av->sk );
+   skeleton_apply_inverses( &av->sk, localplayer.final_mtx );
 }
 
 /*
  * Make the ragdoll copy the player model
  */
-VG_STATIC void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
+static void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
                                             struct player_ragdoll *rd,
                                             v3f velocity )
 {
@@ -239,12 +241,12 @@ VG_STATIC void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
       v3f pos, offset;
       u32 bone = part->bone_id;
 
-      m4x3_mulv( av->sk.final_mtx[bone], av->sk.bones[bone].co, pos );
-      m3x3_mulv( av->sk.final_mtx[bone], part->collider_mtx[3], offset );
+      m4x3_mulv( localplayer.final_mtx[bone], av->sk.bones[bone].co, pos );
+      m3x3_mulv( localplayer.final_mtx[bone], part->collider_mtx[3], offset );
       v3_add( pos, offset, part->obj.rb.co );
 
       m3x3f r;
-      m3x3_mul( av->sk.final_mtx[bone], part->collider_mtx, r );
+      m3x3_mul( localplayer.final_mtx[bone], part->collider_mtx, r );
       m3x3_q( r, part->obj.rb.q );
 
       v3_copy( velocity, part->obj.rb.v );
@@ -260,15 +262,14 @@ VG_STATIC void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
 /*
  * Draw rigidbody colliders for ragdoll
  */
-VG_STATIC void player_debug_ragdoll(void)
+static void player_debug_ragdoll(void)
 {
 }
 
 /*
  * Ragdoll physics step
  */
-VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd )
-{
+static void player_ragdoll_iter( struct player_ragdoll *rd ){
    world_instance *world = world_current_instance();
 
    int run_sim = 0;
@@ -295,12 +296,14 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd )
          if( rd->parts[i].obj.type == k_rb_shape_capsule ){
             l = rb_capsule__scene( rd->parts[i].obj.rb.to_world,
                                    &rd->parts[i].obj.inf.capsule,
-                                   NULL, &world->rb_geo.inf.scene, buf );
+                                   NULL, &world->rb_geo.inf.scene, buf,
+                                   k_material_flag_ghosts );
          }
          else if( rd->parts[i].obj.type == k_rb_shape_box ){
             l = rb_box__scene( rd->parts[i].obj.rb.to_world,
                                rd->parts[i].obj.rb.bbx,
-                               NULL, &world->rb_geo.inf.scene, buf );
+                               NULL, &world->rb_geo.inf.scene, buf,
+                               k_material_flag_ghosts );
          }
          else continue;
 
@@ -346,14 +349,15 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd )
       }
    }
 
-   for( int j=0; j<rd->part_count; j++ ){
-      struct ragdoll_part *pj = &rd->parts[j];
+   if( world->water.enabled ){
+      for( int j=0; j<rd->part_count; j++ ){
+         struct ragdoll_part *pj = &rd->parts[j];
 
-      if( run_sim ){
-         v4f plane = {0.0f,1.0f,0.0f,0.0f};
-         rb_effect_simple_bouyency( &pj->obj.rb, plane, 
-                                     k_ragdoll_floatyiness,
-                                     k_ragdoll_floatydrag );
+         if( run_sim ){
+            rb_effect_simple_bouyency( &pj->obj.rb, world->water.plane,
+                                        k_ragdoll_floatyiness,
+                                        k_ragdoll_floatydrag );
+         }
       }
    }