seperate rand instances for each thread
[carveJwlIkooP6JGAAIwe30JlM.git] / player_ragdoll.c
index d5029dd72865edc08759f826d370587e6a10ac32..f0a6f88c7b5de75bd31888f0fe70a699d6e7d72b 100644 (file)
@@ -82,9 +82,7 @@ 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,
-                                   struct player_avatar *av, u32 bone_id )
-{
+static u32 ragdoll_bone_parent( struct player_ragdoll *rd, u32 bone_id ){
    for( u32 j=0; j<rd->part_count; j++ )
       if( rd->parts[ j ].bone_id == bone_id )
          return j;
@@ -94,21 +92,20 @@ static u32 ragdoll_bone_parent( struct player_ragdoll *rd,
 }
 
 /*
- * Setup ragdoll colliders 
+ * Setup ragdoll colliders from skeleton
  */
-static void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
-                                                 struct player_avatar *av )
-{
+static void setup_ragdoll_from_skeleton( struct skeleton *sk,
+                                         struct player_ragdoll *rd ){
    rd->part_count = 0;
 
-   if( !av->sk.collider_count )
+   if( !sk->collider_count )
       return;
 
    rd->position_constraints_count = 0;
    rd->cone_constraints_count = 0;
 
-   for( u32 i=1; i<av->sk.bone_count; i ++ ){
-      struct skeleton_bone *bone = &av->sk.bones[i];
+   for( u32 i=1; i<sk->bone_count; i ++ ){
+      struct skeleton_bone *bone = &sk->bones[i];
 
       /*
        * Bones with colliders
@@ -131,16 +128,15 @@ static void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
       if( !bone->parent )
          continue;
 
-      rp->parent = ragdoll_bone_parent( rd, av, bone->parent );
-      
+      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 ++ ];
 
-         struct skeleton_bone *bj = &av->sk.bones[rp->bone_id];
+         struct skeleton_bone *bj = &sk->bones[rp->bone_id];
          struct ragdoll_part  *pp = &rd->parts[rp->parent];
-         struct skeleton_bone *bp = &av->sk.bones[pp->bone_id];
+         struct skeleton_bone *bp = &sk->bones[pp->bone_id];
 
          /* Convention: rba -- parent, rbb -- child */
          c->rba = &pp->obj.rb;
@@ -186,9 +182,7 @@ static void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd,
 /*
  * Make avatar copy the ragdoll
  */
-static void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
-                                            struct player_avatar *av )
-{
+static void copy_ragdoll_pose_to_localplayer( struct player_ragdoll *rd ){
    for( int i=0; i<rd->part_count; i++ ){
       struct ragdoll_part *part = &rd->parts[i];
 
@@ -208,12 +202,13 @@ static void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
                 localplayer.final_mtx[part->bone_id] );
    }
 
-   for( u32 i=1; i<av->sk.bone_count; i++ ){
-      struct skeleton_bone *sb = &av->sk.bones[i];
+   for( u32 i=1; i<localplayer.skeleton.bone_count; i++ ){
+      struct skeleton_bone *sb = &localplayer.skeleton.bones[i];
 
       if( sb->parent && !sb->collider ){
          v3f delta;
-         v3_sub( av->sk.bones[i].co, av->sk.bones[sb->parent].co, delta );
+         v3_sub( localplayer.skeleton.bones[i].co, 
+                 localplayer.skeleton.bones[sb->parent].co, delta );
 
          m4x3f posemtx;
          m3x3_identity( posemtx );
@@ -225,31 +220,29 @@ static void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd,
       }
    }
 
-   skeleton_apply_inverses( &av->sk, localplayer.final_mtx );
+   skeleton_apply_inverses( &localplayer.skeleton, localplayer.final_mtx );
 }
 
 /*
  * Make the ragdoll copy the player model
  */
-static void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
-                                            struct player_ragdoll *rd,
-                                            v3f velocity )
-{
+static void copy_localplayer_to_ragdoll( struct player_ragdoll *rd, v3f v ){
    for( int i=0; i<rd->part_count; i++ ){
       struct ragdoll_part *part = &rd->parts[i];
 
       v3f pos, offset;
       u32 bone = part->bone_id;
+      v3f *bone_mtx = localplayer.final_mtx[bone];
 
-      m4x3_mulv( localplayer.final_mtx[bone], av->sk.bones[bone].co, pos );
-      m3x3_mulv( localplayer.final_mtx[bone], part->collider_mtx[3], offset );
+      m4x3_mulv( bone_mtx, localplayer.skeleton.bones[bone].co, pos );
+      m3x3_mulv( bone_mtx, part->collider_mtx[3], offset );
       v3_add( pos, offset, part->obj.rb.co );
 
       m3x3f r;
-      m3x3_mul( localplayer.final_mtx[bone], part->collider_mtx, r );
+      m3x3_mul( bone_mtx, part->collider_mtx, r );
       m3x3_q( r, part->obj.rb.q );
 
-      v3_copy( velocity, part->obj.rb.v );
+      v3_copy( v, part->obj.rb.v );
       v3_zero( part->obj.rb.w );
 
       v3_copy( part->obj.rb.co, part->prev_co );
@@ -259,13 +252,6 @@ static void copy_avatar_pose_to_ragdoll( struct player_avatar *av,
    }
 }
 
-/*
- * Draw rigidbody colliders for ragdoll
- */
-static void player_debug_ragdoll(void)
-{
-}
-
 /*
  * Ragdoll physics step
  */
@@ -450,7 +436,8 @@ static void player_ragdoll_iter( struct player_ragdoll *rd ){
    if( stress ){
       temp_filter = 20;
       audio_lock();
-      audio_oneshot_3d( &audio_hits[vg_randu32()%5], stress->co, 20.0f, 1.0f );
+      audio_oneshot_3d( &audio_hits[vg_randu32(&vg.rand)%5], 
+                        stress->co, 20.0f, 1.0f );
       audio_unlock();
    }
 }