diff options
| author | aura <nw@moneybot.cc> | 2026-02-27 04:43:15 +0100 |
|---|---|---|
| committer | aura <nw@moneybot.cc> | 2026-02-27 04:43:15 +0100 |
| commit | b24f37279bcc4b3abd92b697eadcec1feba8d276 (patch) | |
| tree | 8fe58bee0ae000396d7d048a5630c15bf479af58 /src/game/world | |
| parent | b384930de5044934207d1b2ceb4fa55705094f8b (diff) | |
fix edge collisions, update readme
Diffstat (limited to 'src/game/world')
| -rw-r--r-- | src/game/world/trace.cpp | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/src/game/world/trace.cpp b/src/game/world/trace.cpp index fd6a03b..ba945f0 100644 --- a/src/game/world/trace.cpp +++ b/src/game/world/trace.cpp @@ -204,8 +204,8 @@ inline U8 point_in_inflated_poly( in = in * -1.0f; F32 dist = vec_dot( point - a, in ); - F32 expand = aabb_extend_at_feet( hull, in ).x; - if( dist < -expand - BSP_TRACE_EPSILON ) + F32 expand = aabb_support_radius( hull, in ); + if( dist < -( expand - BSP_TRACE_EPSILON * 4.f ) ) return 0; } return 1; @@ -226,9 +226,7 @@ U8 bsp_trace_sweep_aabb_to_face( VEC3 norm = bsp_face_get_normal( face ); F32 d = vec_dot( norm, face->verts[0].pos ); - VEC2 feet = aabb_extend_at_feet( hull, norm ); - F32 pos_r = feet.x, neg_r = feet.y; - F32 radius = norm.z >= 0 ? neg_r : pos_r; + F32 radius = aabb_support_radius( hull, norm ); VEC3 dir = end - start; F32 s0 = vec_dot( norm, trace->in_start ) - d; @@ -361,11 +359,22 @@ U8 bsp_trace_sweep_aabb( I32 near = (s_dist > 0.f) ? node->front : node->back; I32 far = (s_dist > 0.f) ? node->back : node->front; - if( bsp_trace_sweep_aabb( trace, bsp, hull, start, mid, near ) ) + BSP_TRACE tr_near = *trace; + BSP_TRACE tr_far = *trace; + + U8 hit_near = bsp_trace_sweep_aabb( &tr_near, bsp, hull, start, mid, near ); + U8 hit_far = bsp_trace_sweep_aabb( &tr_far , bsp, hull, mid, end, far ); + + if( hit_near && hit_far ) { + *trace = (tr_near.frac <= tr_far.frac) ? tr_near : tr_far; return 1; + } + + if( hit_near ) { *trace = tr_near; return 1; } + if( hit_far ) { *trace = tr_far; return 1; } if( tin <= BSP_TRACE_EPSILON || tin >= 1.f - BSP_TRACE_EPSILON ) { - F32 nudge = (denom >= 0.f ? 1.f : -1.f) * BSP_TRACE_EPSILON * 4.f; + F32 nudge = (denom >= 0.f ? 1.f : -1.f) * BSP_TRACE_EPSILON; VEC3 nudged = mid + dir * nudge; return bsp_trace_sweep_aabb( trace, bsp, hull, nudged, end, far ); } @@ -380,10 +389,19 @@ U8 bsp_trace( BSP_TRACE* trace, BSP* bsp, AABB hull ) { trace->startsolid = 0; trace->hit = 0; bsp_trace_nudge( trace ); + VEC3 start = trace->in_start; VEC3 end = trace->in_end; - U8 ret = bsp_trace_sweep_aabb( trace, bsp, hull, start, end, bsp->root ); + // start hull at origin rather than in middle + trace->in_start.z += ( hull.max.z - hull.min.z ); + trace->in_end.z += ( hull.max.z - hull.min.z ); + + U8 ret = bsp_trace_sweep_aabb( trace, bsp, hull, trace->in_start, trace->in_end, bsp->root ); + + trace->in_start = start; + trace->in_end = end; + if( !ret ) trace->point = trace->in_end; return ret; |
