From 448cf3b86ec298827a5eac4587c055d461fdaffc Mon Sep 17 00:00:00 2001 From: SirLynix Date: Mon, 20 Nov 2023 23:00:29 +0100 Subject: [PATCH] Math/Ray: Fix Intersect(Box) --- include/Nazara/Math/Ray.inl | 47 ++++++++++++++----------------------- 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/include/Nazara/Math/Ray.inl b/include/Nazara/Math/Ray.inl index 7eb227e1d..6bc867ead 100644 --- a/include/Nazara/Math/Ray.inl +++ b/include/Nazara/Math/Ray.inl @@ -217,47 +217,34 @@ namespace Nz template constexpr bool Ray::Intersect(const Box& box, T* closestHit, T* furthestHit) const { - // http://www.gamedev.net/topic/429443-obb-ray-and-obb-plane-intersection/ - T tfirst = T(0.0); - T tlast = std::numeric_limits::infinity(); - + // https://tavianator.com/2015/ray_box_nan.html Vector3 boxMin = box.GetMinimum(); Vector3 boxMax = box.GetMaximum(); - for (unsigned int i = 0; i < 3; ++i) + T t1 = (boxMin[0] - origin[0]) / direction[0]; + T t2 = (boxMax[0] - origin[0]) / direction[0]; + + T tmin = std::min(t1, t2); + T tmax = std::max(t1, t2); + + for (unsigned int i = 1; i < 3; ++i) { - T dir = direction[i]; - T ori = origin[i]; - T max = boxMax[i]; - T min = boxMin[i]; + t1 = (boxMin[i] - origin[i]) / direction[i]; + t2 = (boxMax[i] - origin[i]) / direction[i]; - if (NumberEquals(dir, T(0.0))) - { - if (ori < max && ori > min) - continue; - - return false; - } - - T tmin = (min - ori) / dir; - T tmax = (max - ori) / dir; - if (tmin > tmax) - std::swap(tmin, tmax); - - if (tmax < tfirst || tmin > tlast) - return false; - - tfirst = std::max(tfirst, tmin); - tlast = std::min(tlast, tmax); + tmin = std::max(tmin, std::min(t1, t2)); + tmax = std::min(tmax, std::max(t1, t2)); } + tmin = std::max(tmin, T(0.0)); + if (closestHit) - *closestHit = tfirst; + *closestHit = tmin; if (furthestHit) - *furthestHit = tlast; + *furthestHit = tmax; - return true; + return tmax > tmin; } /*!