-#include "player.h"
-
-static float k_ragdoll_floatyiness = 10.0f,
- k_ragdoll_floatydrag = 1.0f;
-
-/*
- * Setup ragdoll colliders
- */
-static void player_init_ragdoll( mdl_header *src )
-{
- struct player_model *mdl = &player.mdl;
-
- if( !mdl->sk.collider_count )
- {
- mdl->ragdoll_count = 0;
- return;
- }
-
- mdl->ragdoll = malloc(sizeof(struct ragdoll_part) * mdl->sk.collider_count);
- mdl->ragdoll_count = 0;
-
- for( u32 i=0; i<mdl->sk.bone_count; i ++ )
- {
- struct skeleton_bone *bone = &mdl->sk.bones[i];
-
- if( bone->collider )
- {
- struct ragdoll_part *rp = &mdl->ragdoll[ mdl->ragdoll_count ++ ];
- rp->bone_id = i;
-
- v3f delta;
- v3_sub( bone->hitbox[1], bone->hitbox[0], delta );
- v3_muls( delta, 0.5f, delta );
-
- v3_add( bone->hitbox[0], delta, rp->offset );
-
- v3_copy( delta, rp->rb.bbx[1] );
- v3_muls( delta, -1.0f, rp->rb.bbx[0] );
-
- q_identity( rp->rb.q );
- v3_add( bone->co, rp->offset, rp->rb.co );
- rp->rb.type = k_rb_shape_box;
- rp->rb.is_world = 0;
- rp->parent = 0xffffffff;
-
- if( bone->parent )
- {
- for( u32 j=0; j<mdl->ragdoll_count; j++ )
- {
- if( mdl->ragdoll[ j ].bone_id == bone->parent )
- {
- rp->parent = j;
- break;
- }
- }
- }
-
- /* TODO: refactor to use this style elswhere */
- struct mdl_node *pnode = mdl_node_from_id( src, bone->orig_node );
- struct classtype_bone *bone_inf = mdl_get_entdata( src, pnode );
-
- rp->use_limits = bone_inf->use_limits;
- v3_copy( bone_inf->angle_limits[0], rp->limits[0] );
- v3_copy( bone_inf->angle_limits[1], rp->limits[1] );
-
- rb_init( &rp->rb );
- }
- }
-}
-
-/*
- * Make the player model copy the ragdoll
- */
-static void player_model_copy_ragdoll(void)
-{
- struct player_model *mdl = &player.mdl;
-
- for( int i=0; i<mdl->ragdoll_count; i++ )
- {
- struct ragdoll_part *part = &mdl->ragdoll[i];
- m4x3f offset;
- m3x3_identity(offset);
- v3_negate( part->offset, offset[3] );
- m4x3_mul( part->rb.to_world, offset, mdl->sk.final_mtx[part->bone_id] );
- }
-
- skeleton_apply_inverses( &mdl->sk );
-}
-
-/*
- * Make the ragdoll copy the player model
- */
-static void player_ragdoll_copy_model( v3f v )
-{
- struct player_model *mdl = &player.mdl;
-
- for( int i=0; i<mdl->ragdoll_count; i++ )
- {
- struct ragdoll_part *part = &mdl->ragdoll[i];
-
- v3f pos, offset;
- u32 bone = part->bone_id;
-
- m4x3_mulv( mdl->sk.final_mtx[bone], mdl->sk.bones[bone].co, pos );
- m3x3_mulv( mdl->sk.final_mtx[bone], part->offset, offset );
- v3_add( pos, offset, part->rb.co );
- m3x3_q( mdl->sk.final_mtx[bone], part->rb.q );
- v3_copy( v, part->rb.v );
- v3_zero( part->rb.w );