X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_ragdoll.c;h=6f9d430c56cefff23fe7ca69ed577f8e0597327b;hb=refs%2Fheads%2Fmaster;hp=6dc171d0f28c73944b13254d43fe76f1634cfe9d;hpb=ffc664de040aab29a4fbeec14307996d8e9ae2ec;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_ragdoll.c b/player_ragdoll.c index 6dc171d..6f9d430 100644 --- a/player_ragdoll.c +++ b/player_ragdoll.c @@ -5,8 +5,23 @@ #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" ); @@ -42,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 ); @@ -55,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; @@ -128,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; jpart_count; j++ ) if( rd->parts[ j ].bone_id == bone_id ) return j; @@ -140,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 ) @@ -236,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; ipart_count; i++ ){ struct ragdoll_part *part = &rd->parts[i]; @@ -280,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]; @@ -328,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; @@ -412,11 +433,14 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){ } } - if( world->water.enabled ){ - for( int j=0; jpart_count; j++ ){ + if( localplayer.drowned ) + { + for( int j=0; jpart_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 ); @@ -439,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 ); @@ -536,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 ); @@ -580,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 } }