X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=player_ragdoll.h;h=3fd552471001449920d1fe49d589f5add73352d9;hb=9d5997f1e611b66c7220f7eb388f427032d8da79;hp=2bb0ae4220b1f7b3317f8b8dcbb490bdd58cdf96;hpb=343d594b37f42a94f220a5089c9db36da9da3ab4;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/player_ragdoll.h b/player_ragdoll.h index 2bb0ae4..3fd5524 100644 --- a/player_ragdoll.h +++ b/player_ragdoll.h @@ -42,8 +42,7 @@ VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone, { m4x3_identity( rp->collider_mtx ); - if( bone->flags & k_bone_flag_collider_box ) - { + if( bone->collider == k_bone_collider_box ){ v3f delta; v3_sub( bone->hitbox[1], bone->hitbox[0], delta ); v3_muls( delta, 0.5f, delta ); @@ -56,18 +55,15 @@ VG_STATIC void player_init_ragdoll_bone_collider( struct skeleton_bone *bone, rp->rb.type = k_rb_shape_box; rp->colour = 0xffcccccc; } - else if( bone->flags & k_bone_flag_collider_capsule ) - { + else if( bone->collider == k_bone_collider_capsule ){ v3f v0, v1, tx, ty; v3_sub( bone->hitbox[1], bone->hitbox[0], v0 ); int major_axis = 0; float largest = -1.0f; - for( int i=0; i<3; i ++ ) - { - if( fabsf( v0[i] ) > largest ) - { + for( int i=0; i<3; i ++ ){ + if( fabsf( v0[i] ) > largest ){ largest = fabsf( v0[i] ); major_axis = i; } @@ -133,14 +129,13 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd, rd->position_constraints_count = 0; rd->cone_constraints_count = 0; - for( u32 i=0; isk.bone_count; i ++ ) - { + for( u32 i=0; isk.bone_count; i ++ ){ struct skeleton_bone *bone = &av->sk.bones[i]; /* * Bones with colliders */ - if( !(bone->flags & k_bone_flag_collider_any) ) + if( !(bone->collider) ) continue; if( rd->part_count > vg_list_size(rd->parts) ) @@ -152,9 +147,6 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd, player_init_ragdoll_bone_collider( bone, rp ); - struct mdl_node *pnode = mdl_node_from_id( &av->meta, bone->orig_node ); - struct classtype_bone *inf = mdl_get_entdata( &av->meta, pnode ); - /* * Bones with collider and parent */ @@ -163,27 +155,30 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd, rp->parent = ragdoll_bone_parent( rd, av, bone->parent ); - /* Always assign a point-to-point constraint */ - struct rb_constr_pos *c = - &rd->position_constraints[ rd->position_constraints_count ++ ]; + + 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 ragdoll_part *pp = &rd->parts[rp->parent]; - struct skeleton_bone *bp = &av->sk.bones[pp->bone_id]; + struct skeleton_bone *bj = &av->sk.bones[rp->bone_id]; + struct ragdoll_part *pp = &rd->parts[rp->parent]; + struct skeleton_bone *bp = &av->sk.bones[pp->bone_id]; - /* Convention: rba -- parent, rbb -- child */ - c->rba = &pp->rb; - c->rbb = &rp->rb; + /* Convention: rba -- parent, rbb -- child */ + c->rba = &pp->rb; + c->rbb = &rp->rb; + + v3f delta; + v3_sub( bj->co, bp->co, delta ); + m4x3_mulv( rp->inv_collider_mtx, (v3f){0.0f,0.0f,0.0f}, c->lcb ); + m4x3_mulv( pp->inv_collider_mtx, delta, c->lca ); + + + mdl_bone *inf = bone->orig_bone; - v3f delta; - v3_sub( bj->co, bp->co, delta ); - m4x3_mulv( rp->inv_collider_mtx, (v3f){0.0f,0.0f,0.0f}, c->lcb ); - m4x3_mulv( pp->inv_collider_mtx, delta, c->lca ); - - if( inf->flags & k_bone_flag_cone_constraint ) - { struct rb_constr_swingtwist *a = &rd->cone_constraints[ rd->cone_constraints_count ++ ]; + a->rba = &pp->rb; a->rbb = &rp->rb; a->conet = cosf( inf->conet )-0.0001f; @@ -216,8 +211,7 @@ VG_STATIC void player_setup_ragdoll_from_avatar( struct player_ragdoll *rd, VG_STATIC void copy_ragdoll_pose_to_avatar( struct player_ragdoll *rd, struct player_avatar *av ) { - for( int i=0; ipart_count; i++ ) - { + for( int i=0; ipart_count; i++ ){ struct ragdoll_part *part = &rd->parts[i]; m4x3f offset; m3x3_identity(offset); @@ -235,8 +229,7 @@ VG_STATIC void copy_avatar_pose_to_ragdoll( struct player_avatar *av, struct player_ragdoll *rd, v3f velocity ) { - for( int i=0; ipart_count; i++ ) - { + for( int i=0; ipart_count; i++ ){ struct ragdoll_part *part = &rd->parts[i]; v3f pos, offset; @@ -274,25 +267,31 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd ) int run_sim = 0; ragdoll_frame ++; - if( ragdoll_frame >= k_ragdoll_div ) - { + if( ragdoll_frame >= k_ragdoll_div ){ ragdoll_frame = 0; run_sim = 1; } rb_solver_reset(); - for( int i=0; ipart_count; i ++ ) - { - if( rb_global_has_space() ) - { + for( int i=0; ipart_count; i ++ ){ + if( rb_global_has_space() ){ rb_ct *buf = rb_global_buffer(); - int l = rb_capsule__scene( rd->parts[i].rb.to_world, - &rd->parts[i].rb.inf.capsule, - NULL, &world->rb_geo.inf.scene, buf ); + int l; + + if( rd->parts[i].rb.type == k_rb_shape_capsule ){ + l = rb_capsule__scene( rd->parts[i].rb.to_world, + &rd->parts[i].rb.inf.capsule, + NULL, &world->rb_geo.inf.scene, buf ); + } + else if( rd->parts[i].rb.type == k_rb_shape_box ){ + l = rb_box__scene( rd->parts[i].rb.to_world, + rd->parts[i].rb.bbx, + NULL, &world->rb_geo.inf.scene, buf ); + } + else continue; - for( int j=0; jparts[i].rb; buf[j].rbb = &world->rb_geo; } @@ -302,42 +301,42 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd ) } /* - * COLLISION DETECTION + * self-collision */ - for( int i=0; ipart_count-1; i ++ ) - { - for( int j=i+1; jpart_count; j ++ ) - { - if( rd->parts[j].parent != i ) - { - if( rb_global_has_space() ) - { - rb_ct *buf = rb_global_buffer(); - - int l = rb_capsule__capsule( rd->parts[i].rb.to_world, - &rd->parts[i].rb.inf.capsule, - rd->parts[j].rb.to_world, - &rd->parts[j].rb.inf.capsule, - buf ); - - for( int k=0; kparts[i].rb; - buf[k].rbb = &rd->parts[j].rb; - } - - rb_contact_count += l; + for( int i=0; ipart_count-1; i ++ ){ + for( int j=i+1; jpart_count; j ++ ){ + if( rd->parts[j].parent != i ){ + if( !rb_global_has_space() ) + break; + + if( rd->parts[j].rb.type != k_rb_shape_capsule ) + continue; + + if( rd->parts[i].rb.type != k_rb_shape_capsule ) + continue; + + rb_ct *buf = rb_global_buffer(); + + int l = rb_capsule__capsule( rd->parts[i].rb.to_world, + &rd->parts[i].rb.inf.capsule, + rd->parts[j].rb.to_world, + &rd->parts[j].rb.inf.capsule, + buf ); + + for( int k=0; kparts[i].rb; + buf[k].rbb = &rd->parts[j].rb; } + + rb_contact_count += l; } } } - for( int j=0; jpart_count; j++ ) - { + for( int j=0; jpart_count; j++ ){ struct ragdoll_part *pj = &rd->parts[j]; - if( run_sim ) - { + if( run_sim ){ v4f plane = {0.0f,1.0f,0.0f,0.0f}; rb_effect_simple_bouyency( &pj->rb, plane, k_ragdoll_floatyiness, k_ragdoll_floatydrag ); @@ -354,14 +353,12 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd ) /* * DEBUG */ - if( k_ragdoll_debug_collider ) - { + if( k_ragdoll_debug_collider ){ for( u32 i=0; ipart_count; i ++ ) rb_debug( &rd->parts[i].rb, rd->parts[i].colour ); } - if( k_ragdoll_debug_constraints ) - { + if( k_ragdoll_debug_constraints ){ rb_debug_position_constraints( rd->position_constraints, rd->position_constraints_count ); @@ -372,10 +369,8 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd ) /* * SOLVE CONSTRAINTS */ - if( run_sim ) - { - for( int i=0; i<25; i++ ) - { + if( run_sim ){ + for( int i=0; i<16; i++ ){ rb_solve_contacts( rb_contact_buffer, rb_contact_count ); rb_solve_swingtwist_constraints( rd->cone_constraints, rd->cone_constraints_count );