Skip to content

Commit e7e6049

Browse files
committed
raycast: fix NaN check
- when dir is NaN, it can't be compared against eps - return early in the degenerate case
1 parent 45ac4ad commit e7e6049

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/raycast.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,24 @@ raycast_result_s do_raycasting(std::conditional_t<EnableDiagnostics, raycast_dia
132132

133133
auto V = pt_to_vec(from, to);
134134
auto ray_len = V.length();
135-
auto dir = V.normalized();
136135

137-
if (abs(dir.x()) < eps && abs(dir.y()) < eps) [[unlikely]]
138-
dir = {eps, eps};
136+
if (ray_len < eps)
137+
{
138+
result = {
139+
.from = from,
140+
.to = to,
141+
.collision = {},
142+
.collider = {
143+
.type = (uint64_t)collision_type::none,
144+
.pass = (uint64_t)pass_mode::pass,
145+
.id = ((uint64_t)1 << collision_data_BITS)-1,
146+
},
147+
.has_result = true,
148+
.success = true,
149+
};
150+
return result;
151+
}
152+
auto dir = V * (1.f/ray_len);
139153

140154
unsigned major_axis, minor_axis;
141155

@@ -159,8 +173,7 @@ raycast_result_s do_raycasting(std::conditional_t<EnableDiagnostics, raycast_dia
159173
size_[minor_axis] = (minor_len + nsteps*2 - 1) / nsteps;
160174
size_[major_axis] = (major_len + nsteps - 1) / nsteps;
161175

162-
auto dir_inv_norm = Vector2(abs(dir.x()) < eps ? copysign(inv_eps, dir.x()) : 1 / dir.x(),
163-
abs(dir.y()) < eps ? copysign(inv_eps, dir.y()) : 1 / dir.y());
176+
auto dir_inv_norm = Vector2{1} / dir;
164177
auto signs = ray_aabb_signs(dir_inv_norm);
165178

166179
result = {

0 commit comments

Comments
 (0)