rigidbody math corrections & ragdoll tweaks for stability
[carveJwlIkooP6JGAAIwe30JlM.git] / player_ragdoll.c
index e3345808923f0ed5e01fe15622dc2e24dc3b16c2..e1231bcbd6956ba83e47b70d7697d1059bf15ebb 100644 (file)
@@ -116,7 +116,7 @@ static void player_init_ragdoll_bone_collider( struct skeleton_bone *bone,
    v3_add( rp->collider_mtx[3], bone->co, rp->obj.rb.co );
    v3_zero( rp->obj.rb.v );
    v3_zero( rp->obj.rb.w );
-   rb_init_object( &rp->obj );
+   rb_init_object( &rp->obj, 4.0f );
 }
 
 /*
@@ -453,14 +453,26 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){
     * SOLVE CONSTRAINTS  & Integrate
     */
    if( run_sim ){
-      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 );
+      /* the solver is not very quickly converging so... */
+      for( int i=0; i<40; i++ ){
+         if( i<20 ){
+            rb_solve_contacts( rb_contact_buffer, rb_contact_count );
+            rb_solve_swingtwist_constraints( rd->cone_constraints, 
+                                             rd->cone_constraints_count );
+            rb_postsolve_swingtwist_constraints( rd->cone_constraints, 
+                                                 rd->cone_constraints_count );
+         }
          rb_solve_position_constraints( rd->position_constraints, 
                                         rd->position_constraints_count );
       }
 
+      rb_correct_position_constraints( rd->position_constraints,
+                                       rd->position_constraints_count, 
+                                       k_ragdoll_correction * 0.5f );
+      rb_correct_swingtwist_constraints( rd->cone_constraints, 
+                                         rd->cone_constraints_count,
+                                         k_ragdoll_correction * 0.25f );
+
       for( int i=0; i<rd->part_count; i++ ){
          rb_iter( &rd->parts[i].obj.rb );
 
@@ -475,16 +487,6 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){
 
       for( int i=0; i<rd->part_count; i++ )
          rb_update_transform( &rd->parts[i].obj.rb );
-
-      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, 
-                                          k_ragdoll_correction * 0.5f );
-      }
    }
 
    rb_ct *stress = NULL;