From 89b5a93c0fa9b72a14ce17c433127ef646ce338f Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 12 Dec 2023 16:02:38 +0000 Subject: [PATCH] active ragdolls --- models_src/ch_none.mdl | Bin 854840 -> 874072 bytes player_dead.c | 5 ++ player_dead.h | 4 ++ player_ragdoll.c | 108 +++++++++++++++++++++++++++++++++++++---- player_ragdoll.h | 9 +++- rigidbody.h | 2 + 6 files changed, 117 insertions(+), 11 deletions(-) diff --git a/models_src/ch_none.mdl b/models_src/ch_none.mdl index 34a6cc12d100d3f76afe9d5e71b6c2b38cc7ad85..e17c75934538d8d81cc7405f1b8ac6f883296ae9 100644 GIT binary patch delta 35400 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 delta 18472 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 diff --git a/player_dead.c b/player_dead.c index 4ee2236..7733c32 100644 --- a/player_dead.c +++ b/player_dead.c @@ -172,4 +172,9 @@ static void player__dead_animator_exchange( bitpack_ctx *ctx, void *data ){ } } +static void player__dead_bind(void){ + struct skeleton *sk = &localplayer.skeleton; + player_dead.anim_bail = skeleton_get_anim( sk, "pose_bail_ball" ); +} + #endif /* PLAYER_DEAD_C */ diff --git a/player_dead.h b/player_dead.h index e4c177e..f90a302 100644 --- a/player_dead.h +++ b/player_dead.h @@ -15,6 +15,8 @@ struct player_dead{ transforms[ 32 ]; } animator; + + struct skeleton_anim *anim_bail; } static player_dead; @@ -24,6 +26,7 @@ static void player__dead_animate (void); static void player__dead_pose (void *animator, player_pose *pose); static void player__dead_post_animate(void); static void player__dead_im_gui (void); +static void player__dead_bind (void); static void player__dead_transition ( enum player_die_type type ); static void player__dead_animator_exchange( bitpack_ctx *ctx, void *data ); @@ -34,6 +37,7 @@ struct player_subsystem_interface static player_subsystem_dead = { .pose = player__dead_pose, .post_animate = player__dead_post_animate, .im_gui = player__dead_im_gui, + .bind = player__dead_bind, .animator_data = &player_dead.animator, .animator_size = sizeof(player_dead.animator), diff --git a/player_ragdoll.c b/player_ragdoll.c index ff6a533..e334580 100644 --- a/player_ragdoll.c +++ b/player_ragdoll.c @@ -40,7 +40,12 @@ static int dev_ragdoll_saveload(int argc, const char *argv[]){ } static 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_VAR_F32( k_ragdoll_limit_scale ); + VG_VAR_F32( k_ragdoll_spring ); + VG_VAR_F32( k_ragdoll_dampening ); VG_VAR_I32( k_ragdoll_div ); VG_VAR_I32( k_ragdoll_debug_collider ); VG_VAR_I32( k_ragdoll_debug_constraints ); @@ -151,7 +156,10 @@ static void setup_ragdoll_from_skeleton( struct skeleton *sk, if( rd->part_count > vg_list_size(rd->parts) ) vg_fatal_error( "Playermodel has too many colliders" ); - struct ragdoll_part *rp = &rd->parts[ rd->part_count ++ ]; + u32 part_id = rd->part_count; + rd->part_count ++; + + struct ragdoll_part *rp = &rd->parts[ part_id ]; rp->bone_id = i; rp->parent = 0xffffffff; @@ -166,12 +174,17 @@ static void setup_ragdoll_from_skeleton( struct skeleton *sk, rp->parent = ragdoll_bone_parent( rd, bone->parent ); if( bone->orig_bone->flags & k_bone_flag_cone_constraint ){ - struct rb_constr_pos *c = - &rd->position_constraints[ rd->position_constraints_count ++ ]; + u32 conid = rd->position_constraints_count; + rd->position_constraints_count ++; + + struct rb_constr_pos *c = &rd->position_constraints[ conid ]; struct skeleton_bone *bj = &sk->bones[rp->bone_id]; struct ragdoll_part *pp = &rd->parts[rp->parent]; struct skeleton_bone *bp = &sk->bones[pp->bone_id]; + + rd->constraint_associations[conid][0] = rp->parent; + rd->constraint_associations[conid][1] = part_id; /* Convention: rba -- parent, rbb -- child */ c->rba = &pp->obj.rb; @@ -437,10 +450,10 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){ } /* - * SOLVE CONSTRAINTS + * SOLVE CONSTRAINTS & Integrate */ if( run_sim ){ - for( int i=0; i<16; i++ ){ + for( int i=0; i<12; i++ ){ rb_solve_contacts( rb_contact_buffer, rb_contact_count ); rb_solve_swingtwist_constraints( rd->cone_constraints, rd->cone_constraints_count ); @@ -448,17 +461,30 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){ rd->position_constraints_count ); } - for( int i=0; ipart_count; i++ ) + for( int i=0; ipart_count; i++ ){ rb_iter( &rd->parts[i].obj.rb ); + v3f w; + v3_copy( rd->parts[i].obj.rb.w, w ); + if( v3_length2( w ) > 0.00001f ){ + v3_normalize( w ); + v3_muladds( rd->parts[i].obj.rb.w, w, -k_ragdoll_angular_drag, + rd->parts[i].obj.rb.w ); + } + } + for( int i=0; ipart_count; i++ ) rb_update_transform( &rd->parts[i].obj.rb ); - rb_correct_swingtwist_constraints( rd->cone_constraints, - rd->cone_constraints_count, 0.125f ); + for( int i=0; i<5; i ++ ){ + rb_correct_swingtwist_constraints( rd->cone_constraints, + rd->cone_constraints_count, + k_ragdoll_correction * 0.25f ); - rb_correct_position_constraints( rd->position_constraints, - rd->position_constraints_count, 0.25f ); + rb_correct_position_constraints( rd->position_constraints, + rd->position_constraints_count, + k_ragdoll_correction * 0.5f ); + } } rb_ct *stress = NULL; @@ -482,6 +508,68 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){ static u32 temp_filter = 0; + /* + * motorized joints + */ + 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 ); + + for( u32 i=0; icone_constraints_count; i ++ ){ + rb_constr_swingtwist *st = &rd->cone_constraints[i]; + rb_constr_pos *pc = &rd->position_constraints[i]; + + v3f va, vap; + + m3x3_mulv( st->rbb->to_world, st->coneva, va ); + + /* calculate va as seen in rest position, from the perspective of the + * parent object, mapped to pose world space using the parents + * transform. thats our target */ + + u32 id_p = rd->constraint_associations[i][0], + id_a = rd->constraint_associations[i][1]; + + struct ragdoll_part *pa = &rd->parts[ id_a ], + *pp = &rd->parts[ id_p ]; + + mdl_keyframe *kf = &anim[ pa->bone_id-1 ]; + m3x3_mulv( pa->collider_mtx, st->coneva, vap ); + q_mulv( kf->q, vap, vap ); + + /* This could be a transfer function */ + m3x3_mulv( pp->inv_collider_mtx, vap, vap ); + m3x3_mulv( st->rba->to_world, vap, vap ); + + f32 d = v3_dot( vap, va ), + a = acosf( vg_clampf( d, -1.0f, 1.0f ) ); + + v3f axis; + v3_cross( vap, va, axis ); + + f32 Fs = -a * k_ragdoll_spring, + Fd = -v3_dot( st->rbb->w, axis ) * k_ragdoll_dampening, + F = Fs+Fd; + + v3f torque; + v3_muls( axis, F, torque ); + v3_muladds( st->rbb->w, torque, k_rb_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 ); +#endif + } + } + if( temp_filter ){ temp_filter --; return; diff --git a/player_ragdoll.h b/player_ragdoll.h index 0afc330..6f5a331 100644 --- a/player_ragdoll.h +++ b/player_ragdoll.h @@ -33,12 +33,19 @@ struct player_ragdoll{ rb_constr_swingtwist cone_constraints[32]; u32 cone_constraints_count; + /* TODO: Fix duplicated data */ + u32 constraint_associations[32][2]; int shoes[2]; }; static float k_ragdoll_floatyiness = 20.0f, k_ragdoll_floatydrag = 1.0f, - k_ragdoll_limit_scale = 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, diff --git a/rigidbody.h b/rigidbody.h index 2c074c4..a69e4af 100644 --- a/rigidbody.h +++ b/rigidbody.h @@ -330,9 +330,11 @@ static void rb_iter( rigidbody *rb ){ q_mul( rotation, rb->q, rb->q ); } +#if 0 /* damping */ v3_muls( rb->v, 1.0f/(1.0f+k_rb_delta*k_damp_linear), rb->v ); v3_muls( rb->w, 1.0f/(1.0f+k_rb_delta*k_damp_angular), rb->w ); +#endif } -- 2.25.1