X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;ds=sidebyside;f=player_ragdoll.h;h=40ee45158ded5b131eff9649bba16d4691c922cc;hb=4af3f141e332ae426ecda80ca4ccd8cf4e84d0cb;hp=101d8f9c5850f488a5d7fe06162dfd7dca5b97db;hpb=610907ae753bdda202236d52a6fcf77d14d63193;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_ragdoll.h b/player_ragdoll.h index 101d8f9..40ee451 100644 --- a/player_ragdoll.h +++ b/player_ragdoll.h @@ -17,6 +17,9 @@ struct player_ragdoll{ m4x3f collider_mtx, inv_collider_mtx; + v4f prev_q; + v3f prev_co; + u32 use_limits; v3f limits[2]; @@ -36,6 +39,23 @@ struct player_ragdoll{ int shoes[2]; }; +VG_STATIC float k_ragdoll_floatyiness = 20.0f, + k_ragdoll_floatydrag = 1.0f, + k_ragdoll_limit_scale = 1.0f; + +VG_STATIC int k_ragdoll_div = 1, + ragdoll_frame = 0, + k_ragdoll_debug_collider = 1, + k_ragdoll_debug_constraints = 0; + +VG_STATIC void player_ragdoll_init(void) +{ + VG_VAR_F32( k_ragdoll_limit_scale ); + VG_VAR_I32( k_ragdoll_div ); + VG_VAR_I32( k_ragdoll_debug_collider ); + VG_VAR_I32( k_ragdoll_debug_constraints ); +} + VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone, struct ragdoll_part *rp ) { @@ -215,10 +235,20 @@ VG_STATIC void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd, { for( int i=0; ipart_count; i++ ){ struct ragdoll_part *part = &rd->parts[i]; - m4x3f offset; - m3x3_identity(offset); - m4x3_mul( part->obj.rb.to_world, part->inv_collider_mtx, - av->sk.final_mtx[part->bone_id] ); + + m4x3f mtx; + + v4f q_int; + v3f co_int; + + float substep = vg.time_fixed_extrapolate; + v3_lerp( part->prev_co, part->obj.rb.co, substep, co_int ); + q_nlerp( part->prev_q, part->obj.rb.q, substep, q_int ); + + q_m3x3( q_int, mtx ); + v3_copy( co_int, mtx[3] ); + + m4x3_mul( mtx, part->inv_collider_mtx, av->sk.final_mtx[part->bone_id] ); } for( u32 i=1; isk.bone_count; i++ ){ @@ -263,6 +293,9 @@ VG_STATIC void copy_avatar_pose_to_ragdoll( struct player_avatar *av, v3_copy( velocity, part->obj.rb.v ); v3_zero( part->obj.rb.w ); + + v3_copy( part->obj.rb.co, part->prev_co ); + v4_copy( part->obj.rb.q, part->prev_q ); rb_update_transform( &part->obj.rb ); } @@ -295,6 +328,9 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd ) float contact_velocities[256]; for( int i=0; ipart_count; i ++ ){ + v4_copy( rd->parts[i].obj.rb.q, rd->parts[i].prev_q ); + v3_copy( rd->parts[i].obj.rb.co, rd->parts[i].prev_co ); + if( rb_global_has_space() ){ rb_ct *buf = rb_global_buffer();