update helpers/location to 'frosted' ui
[carveJwlIkooP6JGAAIwe30JlM.git] / player_ragdoll.c
index 093b86f0bee2d67db25b0c46653153a9987437b9..6f9d430c56cefff23fe7ca69ed577f8e0597327b 100644 (file)
@@ -1,9 +1,27 @@
-#ifndef PLAYER_RAGDOLL_C
-#define PLAYER_RAGDOLL_C
+#pragma once
+#include "vg/vg_rigidbody.h"
+#include "vg/vg_rigidbody_collision.h"
+#include "vg/vg_rigidbody_constraints.h"
+#include "scene_rigidbody.h"
 
 #include "player.h"
+#include "player_dead.h"
 #include "audio.h"
 
+static float k_ragdoll_floatyiness = 20.0f,
+             k_ragdoll_floatydrag  = 1.0f,
+             k_ragdoll_limit_scale = 1.0f,
+             k_ragdoll_spring = 127.0f,
+             k_ragdoll_dampening = 15.0f,
+             k_ragdoll_correction = 0.5f,
+             k_ragdoll_angular_drag = 0.08f,
+             k_ragdoll_active_threshold = 5.0f;
+
+static int   k_ragdoll_div = 1,
+             ragdoll_frame = 0,
+             k_ragdoll_debug_collider = 1,
+             k_ragdoll_debug_constraints = 0;
+
 static int dev_ragdoll_saveload(int argc, const char *argv[]){
    if( argc != 2 ){
       vg_info( "Usage: ragdoll load/save filepath\n" );
@@ -39,7 +57,8 @@ static int dev_ragdoll_saveload(int argc, const char *argv[]){
    return 0;
 }
 
-static void player_ragdoll_init(void){
+void player_ragdoll_init(void)
+{
    VG_VAR_F32( k_ragdoll_active_threshold );
    VG_VAR_F32( k_ragdoll_angular_drag );
    VG_VAR_F32( k_ragdoll_correction );
@@ -52,8 +71,8 @@ static void player_ragdoll_init(void){
    vg_console_reg_cmd( "ragdoll", dev_ragdoll_saveload, NULL );
 }
 
-static void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
-                                                  struct ragdoll_part *rp )
+void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
+                                        struct ragdoll_part *rp )
 {
    f32 k_density = 8.0f,
        k_inertia_scale = 2.0f;
@@ -125,7 +144,8 @@ static void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
 /*
  * Get parent index in the ragdoll
  */
-static u32 ragdoll_bone_parent( struct player_ragdoll *rd, u32 bone_id ){
+u32 ragdoll_bone_parent( struct player_ragdoll *rd, u32 bone_id )
+{
    for( u32 j=0; j<rd->part_count; j++ )
       if( rd->parts[ j ].bone_id == bone_id )
          return j;
@@ -137,8 +157,9 @@ static u32 ragdoll_bone_parent( struct player_ragdoll *rd, u32 bone_id ){
 /*
  * Setup ragdoll colliders from skeleton
  */
-static void setup_ragdoll_from_skeleton( struct skeleton *sk,
-                                         struct player_ragdoll *rd ){
+void setup_ragdoll_from_skeleton( struct skeleton *sk,
+                                  struct player_ragdoll *rd )
+{
    rd->part_count = 0;
 
    if( !sk->collider_count )
@@ -233,7 +254,8 @@ static void setup_ragdoll_from_skeleton( struct skeleton *sk,
 /*
  * Make avatar copy the ragdoll
  */
-static void copy_ragdoll_pose_to_localplayer( struct player_ragdoll *rd ){
+void copy_ragdoll_pose_to_localplayer( struct player_ragdoll *rd )
+{
    for( int i=0; i<rd->part_count; i++ ){
       struct ragdoll_part *part = &rd->parts[i];
 
@@ -277,8 +299,9 @@ static void copy_ragdoll_pose_to_localplayer( struct player_ragdoll *rd ){
 /*
  * Make the ragdoll copy the player model
  */
-static void copy_localplayer_to_ragdoll( struct player_ragdoll *rd, 
-                                         enum player_die_type type ){
+void copy_localplayer_to_ragdoll( struct player_ragdoll *rd, 
+                                  enum player_die_type type )
+{
    v3f centroid;
 
    v3f *bone_mtx = localplayer.final_mtx[localplayer.id_hip];
@@ -325,7 +348,8 @@ static void copy_localplayer_to_ragdoll( struct player_ragdoll *rd,
 /*
  * Ragdoll physics step
  */
-static void player_ragdoll_iter( struct player_ragdoll *rd ){
+void player_ragdoll_iter( struct player_ragdoll *rd )
+{
    world_instance *world = world_current_instance();
 
    int run_sim = 0;
@@ -409,11 +433,14 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){
       }
    }
 
-   if( world->water.enabled ){
-      for( int j=0; j<rd->part_count; j++ ){
+   if( localplayer.drowned )
+   {
+      for( int j=0; j<rd->part_count; j++ )
+      {
          struct ragdoll_part *pj = &rd->parts[j];
 
-         if( run_sim ){
+         if( run_sim )
+         {
             rb_effect_simple_bouyency( &pj->rb, world->water.plane,
                                         k_ragdoll_floatyiness,
                                         k_ragdoll_floatydrag );
@@ -436,7 +463,8 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){
       contact_velocities[i] = vn;
    }
 
-   rb_presolve_contacts( rb_contact_buffer, rb_contact_count );
+   rb_presolve_contacts( rb_contact_buffer, vg.time_fixed_delta, 
+                         rb_contact_count );
    rb_presolve_swingtwist_constraints( rd->cone_constraints,
                                        rd->cone_constraints_count );
 
@@ -533,8 +561,6 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){
    if( run_sim && 
          (v3_length2(player_dead.v_lpf)>(k_ragdoll_active_threshold*
                                          k_ragdoll_active_threshold)) ){
-      assert( rd->cone_constraints_count == rd->position_constraints_count );
-
       mdl_keyframe anim[32];
       skeleton_sample_anim( &localplayer.skeleton, player_dead.anim_bail,
                             0.0f, anim );
@@ -577,14 +603,14 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){
 
          v3f torque;
          v3_muls( axis, F, torque );
-         v3_muladds( st->rbb->w, torque, k_rb_delta, st->rbb->w );
+         v3_muladds( st->rbb->w, torque, vg.time_fixed_delta, st->rbb->w );
 
          /* apply a adjustment to keep velocity at joint 0 */
 #if 0
          v3f wcb, vcb;
          m3x3_mulv( st->rbb->to_world, pc->lcb, wcb );
          v3_cross( torque, wcb, vcb );
-         v3_muladds( st->rbb->v, vcb, k_rb_delta, st->rbb->v );
+         v3_muladds( st->rbb->v, vcb, vg.time_fixed_delta, st->rbb->v );
 #endif
       }
    }
@@ -602,5 +628,3 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){
       audio_unlock();
    }
 }
-
-#endif /* PLAYER_RAGDOLL_C */