diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-04-24 02:00:08 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-04-24 02:00:08 +0100 |
commit | 9ccf9d330071454b5319a58227a3c5e5232f335f (patch) | |
tree | 88f60b8fe8b2c0bbb0e439566d519508bfba928c /lib | |
parent | Avoid out parameters with Ray::intersectTriangle (diff) | |
download | ilt-9ccf9d330071454b5319a58227a3c5e5232f335f.tar.bz2 ilt-9ccf9d330071454b5319a58227a3c5e5232f335f.tar.xz ilt-9ccf9d330071454b5319a58227a3c5e5232f335f.zip |
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ray.h | 25 |
1 files changed, 17 insertions, 8 deletions
@@ -78,21 +78,30 @@ public: return std::nullopt; } - bool - intersectSphere(const PositionType centre, const PositionType::value_type size, PositionType & position, - Normal3D & normal) const + struct IntersectSphereResult { + PositionType position; + Normal3D normal; + }; + + std::optional<IntersectSphereResult> + intersectSphere(const PositionType centre, const PositionType::value_type size) const { + IntersectSphereResult out; if constexpr (std::is_floating_point_v<typename PositionType::value_type>) { - return glm::intersectRaySphere(start, direction, centre, size, position, normal); + if (glm::intersectRaySphere(start, direction, centre, size, out.position, out.normal)) { + return out; + } } else { const RelativePosition3D cr = centre - start; RelativePosition3D positionF {}; - const auto r = glm::intersectRaySphere( - {}, direction, cr, static_cast<RelativeDistance>(size), positionF, normal); - position = GlobalPosition3D(positionF) + start; - return r; + if (glm::intersectRaySphere( + {}, direction, cr, static_cast<RelativeDistance>(size), positionF, out.normal)) { + out.position = GlobalPosition3D(positionF) + start; + return out; + } } + return std::nullopt; } }; |