m4x3f collider_mtx,
inv_collider_mtx;
+ v4f prev_q;
+ v3f prev_co;
+
u32 use_limits;
v3f limits[2];
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 )
{
{
for( int i=0; i<rd->part_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; i<av->sk.bone_count; i++ ){
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 );
}
float contact_velocities[256];
for( int i=0; i<rd->part_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();