From: hgn Date: Thu, 13 Mar 2025 15:13:08 +0000 (+0000) Subject: Add broad phase to prop colliders and add it to skate handler X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=89736ae648c3dd9799a926dd41f566113b705f4e;p=carveJwlIkooP6JGAAIwe30JlM.git Add broad phase to prop colliders and add it to skate handler --- diff --git a/content_skaterift/maps/dev_tutorial/main.mdl b/content_skaterift/maps/dev_tutorial/main.mdl index 1cdda78..6ced7e2 100644 Binary files a/content_skaterift/maps/dev_tutorial/main.mdl and b/content_skaterift/maps/dev_tutorial/main.mdl differ diff --git a/src/player_skate.c b/src/player_skate.c index 159ef86..fb25787 100644 --- a/src/player_skate.c +++ b/src/player_skate.c @@ -398,7 +398,8 @@ void player__approximate_best_trajectory(void) v3f launch_v_bounds[2]; - for( int i=0; i<2; i++ ){ + for( int i=0; i<2; i++ ) + { v3_copy( localplayer.rb.v, launch_v_bounds[i] ); float ang = (float[]){ angle_begin, angle_end }[ i ]; ang *= 0.15f; @@ -408,9 +409,9 @@ void player__approximate_best_trajectory(void) q_mulv( qbias, launch_v_bounds[i], launch_v_bounds[i] ); } - for( int m=0;m<=30; m++ ){ - jump_info *inf = - &player_skate.possible_jumps[ player_skate.possible_jump_count ++ ]; + for( int m=0;m<=30; m++ ) + { + jump_info *inf = &player_skate.possible_jumps[ player_skate.possible_jump_count ++ ]; reset_jump_info( inf ); v3f launch_co, launch_v, co0, co1; @@ -442,7 +443,8 @@ void player__approximate_best_trajectory(void) v3_copy( launch_v, v ); v3_copy( launch_co, co1 ); - for( int i=1; i<=50; i++ ){ + for( int i=1; i<=50; i++ ) + { f32 t = (f32)i * k_trace_delta; /* integrate forces */ @@ -464,8 +466,10 @@ void player__approximate_best_trajectory(void) /* REFACTOR */ v3f closest={0.0f,0.0f,0.0f}; - if( search_for_grind ){ - if( bh_closest_point(trace_world->geo_bh,co1,closest,1.0f) != -1 ){ + if( search_for_grind ) + { + if( bh_closest_point(trace_world->geo_bh,co1,closest,1.0f) != -1 ) + { float min_dist = 0.75f; min_dist *= min_dist; @@ -474,7 +478,8 @@ void player__approximate_best_trajectory(void) v3f bound[2]; - for( int j=0; j<2; j++ ){ + for( int j=0; j<2; j++ ) + { v3_muls( launch_v_bounds[j], t, bound[j] ); bound[j][1] += -0.5f*gravity*t*t; v3_add( launch_co, bound[j], bound[j] ); @@ -484,7 +489,8 @@ void player__approximate_best_trajectory(void) minh = vg_minf( bound[0][1], bound[1][1] )-limh, maxh = vg_maxf( bound[0][1], bound[1][1] )+limh; - if( (closest[1] < minh) || (closest[1] > maxh) ){ + if( (closest[1] < minh) || (closest[1] > maxh) ) + { search_for_grind = 0; } } @@ -492,8 +498,10 @@ void player__approximate_best_trajectory(void) search_for_grind = 0; } - if( search_for_grind ){ - if( skate_grind_scansq( closest, v, 0.5f, &grind ) ){ + if( search_for_grind ) + { + if( skate_grind_scansq( closest, v, 0.5f, &grind ) ) + { /* check alignment */ v2f v0 = { v[0], v[2] }, v1 = { grind.dir[0], grind.dir[2] }; @@ -518,9 +526,11 @@ void player__approximate_best_trajectory(void) } } - if( trace_world->rendering_gate ){ + if( trace_world->rendering_gate ) + { ent_gate *gate = trace_world->rendering_gate; - if( gate_intersect( gate, co1, co0 ) ){ + if( gate_intersect( gate, co1, co0 ) ) + { m4x3_mulv( gate->transport, co0, co0 ); m4x3_mulv( gate->transport, co1, co1 ); m3x3_mulv( gate->transport, launch_v, launch_v); @@ -534,9 +544,9 @@ void player__approximate_best_trajectory(void) float scan_radius = k_board_radius; scan_radius *= vg_clampf( t, 0.02f, 1.0f ); - int idx = spherecast_world( trace_world, co0, co1, scan_radius, &t1, n, - k_material_flag_walking ); - if( idx != -1 ){ + int idx = spherecast_world( trace_world, co0, co1, scan_radius, &t1, n, k_material_flag_walking ); + if( idx != -1 ) + { v3f co; v3_lerp( co0, co1, t1, co ); v3_copy( co, inf->log[ inf->log_length ++ ] ); @@ -2566,7 +2576,8 @@ begin_collision:; * -------------------------------------------------------------------------- */ - for( int i=0; islap, mtx[3] ); + /* board capsule */ rb_ct *cman = &manifold[manifold_len]; - - int l = rb_capsule__scene( mtx, &capsule, NULL, world->geo_bh, - cman, k_material_flag_walking ); - + int l = rb_capsule__scene( mtx, &capsule, NULL, world->geo_bh, cman, k_material_flag_walking ); /* weld joints */ for( int i=0; ient_prop ); i ++ ) + { + ent_prop *prop = af_arritm( &world->ent_prop, i ); + if( prop->flags & k_prop_flag_hidden ) + continue; + + if( prop->flags & k_prop_flag_collider ) + { + f32 box_r = v3_length( prop->transform.s ), + player_r = 2.0f, + min_dist = box_r + player_r, + min_dist2 = min_dist*min_dist; + + if( v3_dist2( localplayer.rb.co, prop->transform.co ) < min_dist2 ) + { + m4x3f mmdl, mmdl_inv; + q_m3x3( prop->transform.q, mmdl ); + v3_copy( prop->transform.co, mmdl[3] ); + m4x3_invert_affine( mmdl, mmdl_inv ); + + boxf box; + v3_negate( prop->transform.s, box[0] ); + v3_copy( prop->transform.s, box[1] ); + manifold_len += rb_sphere__box( localplayer.rb.co, 1.0f, mmdl, mmdl_inv, box, manifold+manifold_len ); + + vg_line_boxf_transformed( mmdl, box, 0xffffff00 ); + } + } + } /* add limits */ - if( state->activity >= k_skate_activity_grind_any ){ - for( int i=0; ilimit_count; i++ ){ + if( state->activity >= k_skate_activity_grind_any ) + { + for( int i=0; ilimit_count; i++ ) + { struct grind_limit *limit = &state->limits[i]; rb_ct *ct = &manifold[ manifold_len ++ ]; m4x3_mulv( localplayer.rb.to_world, limit->ra, ct->co ); @@ -2619,6 +2659,8 @@ begin_collision:; } } + vg_line_capsule( mtx, capsule.r, capsule.h, VG__WHITE ); + /* * Phase 3: Dynamics * -------------------------------------------------------------------------- @@ -2626,11 +2668,11 @@ begin_collision:; v3f world_cog; - m4x3_mulv( localplayer.rb.to_world, - state->weight_distribution, world_cog ); + m4x3_mulv( localplayer.rb.to_world, state->weight_distribution, world_cog ); vg_line_point( world_cog, 0.02f, VG__BLACK ); - for( int i=0; iflags & k_prop_flag_collider ) { - m4x3f mmdl, mmdl_inv; - q_m3x3( prop->transform.q, mmdl ); - v3_copy( prop->transform.co, mmdl[3] ); - m4x3_invert_affine( mmdl, mmdl_inv ); - - boxf box; - v3_negate( prop->transform.s, box[0] ); - v3_copy( prop->transform.s, box[1] ); - len += rb_capsule__box( mtx, &w->collider, mmdl, mmdl_inv, box, manifold+len ); + f32 box_r = v3_length( prop->transform.s ), + player_r = 2.0f, + min_dist = box_r + player_r, + min_dist2 = min_dist*min_dist; + + if( v3_dist2( localplayer.rb.co, prop->transform.co ) < min_dist2 ) + { + m4x3f mmdl, mmdl_inv; + q_m3x3( prop->transform.q, mmdl ); + v3_copy( prop->transform.co, mmdl[3] ); + m4x3_invert_affine( mmdl, mmdl_inv ); + + boxf box; + v3_negate( prop->transform.s, box[0] ); + v3_copy( prop->transform.s, box[1] ); + len += rb_capsule__box( mtx, &w->collider, mmdl, mmdl_inv, box, manifold+len ); + + vg_line_boxf_transformed( mmdl, box, 0xffffff00 ); + } } }