-#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" );
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 );
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;
/*
* 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;
/*
* 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 )
/*
* 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];
/*
* 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];
/*
* 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;
}
}
- 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 );
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 );
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 );
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
}
}
audio_unlock();
}
}
-
-#endif /* PLAYER_RAGDOLL_C */