now fall in immobile mode
[carveJwlIkooP6JGAAIwe30JlM.git] / player_ragdoll.c
index a7e3e7569dae27d7eb413ade9c91a85b96cc2f1f..3dc7ba6e51d8b2e657b84234f386502787d50642 100644 (file)
@@ -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 ]);
@@ -66,7 +66,7 @@ VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
    }
    else{
       vg_warn( "type: %u\n", bone->collider );
-      vg_fatal_exit_loop( "Invalid bone collider type" );
+      vg_fatal_error( "Invalid bone collider type" );
    }
 
    m4x3_invert_affine( rp->collider_mtx, rp->inv_collider_mtx );
@@ -89,7 +89,7 @@ VG_STATIC u32 ragdoll_bone_parent( struct player_ragdoll *rd,
       if( rd->parts[ j ].bone_id == bone_id )
          return j;
 
-   vg_fatal_exit_loop( "Referenced parent bone does not have a rigidbody" );
+   vg_fatal_error( "Referenced parent bone does not have a rigidbody" );
    return 0;
 }
 
@@ -117,7 +117,7 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
          continue;
 
       if( rd->part_count > vg_list_size(rd->parts) )
-         vg_fatal_exit_loop( "Playermodel has too many colliders" );
+         vg_fatal_error( "Playermodel has too many colliders" );
 
       struct ragdoll_part *rp = &rd->parts[ rd->part_count ++ ];
       rp->bone_id = i;
@@ -269,7 +269,7 @@ VG_STATIC void player_debug_ragdoll(void)
  */
 VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd )
 {
-   world_instance *world = get_active_world();
+   world_instance *world = world_current_instance();
 
    int run_sim = 0;
    ragdoll_frame ++;
@@ -295,12 +295,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 +348,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 );
+         }
       }
    }
 
@@ -446,7 +449,7 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd )
    if( stress ){
       temp_filter = 20;
       audio_lock();
-      audio_oneshot_3d( &audio_hits[rand()%5], stress->co, 20.0f, 1.0f );
+      audio_oneshot_3d( &audio_hits[vg_randu32()%5], stress->co, 20.0f, 1.0f );
       audio_unlock();
    }
 }