X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_ragdoll.c;h=ac6e90240fc9fd3a6743dafa057b246777d86da5;hb=e311bbe2fa903a7e2a922f202f389b799193195d;hp=7b5308816d228d173df193b93f2569c9ea80b44a;hpb=ec90a4b46865009c1e1b1679f6926e35d2ee3f12;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_ragdoll.c b/player_ragdoll.c index 7b53088..ac6e902 100644 --- a/player_ragdoll.c +++ b/player_ragdoll.c @@ -4,7 +4,7 @@ #include "player.h" #include "audio.h" -VG_STATIC void player_ragdoll_init(void) +static void player_ragdoll_init(void) { VG_VAR_F32( k_ragdoll_limit_scale ); VG_VAR_I32( k_ragdoll_div ); @@ -12,7 +12,7 @@ VG_STATIC void player_ragdoll_init(void) VG_VAR_I32( k_ragdoll_debug_constraints ); } -VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone, +static void player_init_ragdoll_bone_collider( struct skeleton_bone *bone, struct ragdoll_part *rp ) { m4x3_identity( rp->collider_mtx ); @@ -46,7 +46,7 @@ VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone, v3_zero( v1 ); v1[ major_axis ] = 1.0f; - rb_tangent_basis( v1, tx, ty ); + v3_tangent_basis( v1, tx, ty ); float r = (fabsf(v3_dot(tx,v0)) + fabsf(v3_dot(ty,v0))) * 0.25f, l = fabsf(v0[ major_axis ]); @@ -82,9 +82,7 @@ VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone, /* * Get parent index in the ragdoll */ -VG_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; jpart_count; j++ ) if( rd->parts[ j ].bone_id == bone_id ) return j; @@ -94,21 +92,20 @@ VG_STATIC u32 ragdoll_bone_parent( struct player_ragdoll *rd, } /* - * Setup ragdoll colliders + * Setup ragdoll colliders from skeleton */ -VG_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; isk.bone_count; i ++ ){ - struct skeleton_bone *bone = &av->sk.bones[i]; + for( u32 i=1; ibone_count; i ++ ){ + struct skeleton_bone *bone = &sk->bones[i]; /* * Bones with colliders @@ -131,16 +128,15 @@ VG_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 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd, /* * Make avatar copy the ragdoll */ -VG_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; ipart_count; i++ ){ struct ragdoll_part *part = &rd->parts[i]; @@ -204,50 +198,51 @@ VG_STATIC void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd, 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] ); + m4x3_mul( mtx, part->inv_collider_mtx, + localplayer.final_mtx[part->bone_id] ); } - for( u32 i=1; isk.bone_count; i++ ){ - struct skeleton_bone *sb = &av->sk.bones[i]; + for( u32 i=1; iparent && !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 ); v3_copy( delta, posemtx[3] ); /* final matrix */ - m4x3_mul( av->sk.final_mtx[sb->parent], posemtx, av->sk.final_mtx[i] ); + m4x3_mul( localplayer.final_mtx[sb->parent], posemtx, + localplayer.final_mtx[i] ); } } - skeleton_apply_inverses( &av->sk ); + skeleton_apply_inverses( &localplayer.skeleton, localplayer.final_mtx ); } /* * Make the ragdoll copy the player model */ -VG_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; ipart_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( av->sk.final_mtx[bone], av->sk.bones[bone].co, pos ); - m3x3_mulv( av->sk.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( av->sk.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 ); @@ -257,19 +252,11 @@ VG_STATIC void copy_avatar_pose_to_ragdoll( struct player_avatar *av, } } -/* - * Draw rigidbody colliders for ragdoll - */ -VG_STATIC void player_debug_ragdoll(void) -{ -} - /* * Ragdoll physics step */ -VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd ) -{ - world_instance *world = get_active_world(); +static void player_ragdoll_iter( struct player_ragdoll *rd ){ + world_instance *world = world_current_instance(); int run_sim = 0; ragdoll_frame ++; @@ -295,12 +282,14 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd ) if( rd->parts[i].obj.type == k_rb_shape_capsule ){ l = rb_capsule__scene( rd->parts[i].obj.rb.to_world, &rd->parts[i].obj.inf.capsule, - NULL, &world->rb_geo.inf.scene, buf ); + NULL, &world->rb_geo.inf.scene, buf, + k_material_flag_ghosts ); } else if( rd->parts[i].obj.type == k_rb_shape_box ){ l = rb_box__scene( rd->parts[i].obj.rb.to_world, rd->parts[i].obj.rb.bbx, - NULL, &world->rb_geo.inf.scene, buf ); + NULL, &world->rb_geo.inf.scene, buf, + k_material_flag_ghosts ); } else continue; @@ -346,14 +335,15 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd ) } } - for( int j=0; jpart_count; j++ ){ - struct ragdoll_part *pj = &rd->parts[j]; + if( world->water.enabled ){ + for( int j=0; jpart_count; j++ ){ + struct ragdoll_part *pj = &rd->parts[j]; - if( run_sim ){ - v4f plane = {0.0f,1.0f,0.0f,0.0f}; - rb_effect_simple_bouyency( &pj->obj.rb, plane, - k_ragdoll_floatyiness, - k_ragdoll_floatydrag ); + if( run_sim ){ + rb_effect_simple_bouyency( &pj->obj.rb, world->water.plane, + k_ragdoll_floatyiness, + k_ragdoll_floatydrag ); + } } }