summaryrefslogtreecommitdiff
path: root/src/game/world/trace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/world/trace.cpp')
-rw-r--r--src/game/world/trace.cpp41
1 files changed, 31 insertions, 10 deletions
diff --git a/src/game/world/trace.cpp b/src/game/world/trace.cpp
index fd6a03b..1c28d78 100644
--- a/src/game/world/trace.cpp
+++ b/src/game/world/trace.cpp
@@ -1,5 +1,3 @@
-#include <cfloat>
-
#include "trace.h"
#include "../../util/math.h"
#include "bsp.h"
@@ -204,8 +202,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_EDGE_TOLERANCE ) )
return 0;
}
return 1;
@@ -226,9 +224,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 +357,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,12 +387,26 @@ 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 );
+ // move trace up by half of the hull - extend at feet instead of center
+ VEC3 off = VEC3{ 0, 0, hull.max.z - hull.min.z } * 0.5f;
+
+ trace->in_start += off;
+ trace->in_end += off;
+
+ U8 ret = bsp_trace_sweep_aabb( trace, bsp, hull, trace->in_start, trace->in_end, bsp->root );
+
+ trace->in_start -= off;
+ trace->in_end -= off;
+
if( !ret )
trace->point = trace->in_end;
+ else
+ trace->point -= off;
+
return ret;
}