diff --git a/openVulkanoCpp/Math/AABB.hpp b/openVulkanoCpp/Math/AABB.hpp index d0b8b3b..9c68237 100644 --- a/openVulkanoCpp/Math/AABB.hpp +++ b/openVulkanoCpp/Math/AABB.hpp @@ -86,6 +86,16 @@ namespace OpenVulkano::Math return Range::min + (GetDiagonal() * 0.5f); } + [[nodiscard]] bool Covers(const AABB_T& other) const + { + return other.IsCovered(*this); + } + + [[nodiscard]] bool IsCovered(const AABB_T& other) const + { + return Math::Utils::all(Math::Utils::greaterThanEqual(other.GetMax(), Range::max)) && Math::Utils::all(Math::Utils::greaterThanEqual(Range::min, other.GetMin())); + } + /** * \brief Checks if the AABB overlaps with another AABB * \param other The other AABB that should be checked @@ -93,9 +103,7 @@ namespace OpenVulkano::Math */ [[nodiscard]] bool IsOverlapping(const AABB_T& other) const { - //return !(other.min.x > max.x || other.max.x < min.x || other.min.y > max.y || - // other.max.y < min.y || other.min.z > max.z || other.max.z < min.z); - return Math::Utils::any(Math::Utils::greaterThan(Range::min, other.GetMin())) || Math::Utils::any(Math::Utils::lessThan(other.GetMax(), Range::max)); + return Math::Utils::all(Math::Utils::lessThanEqual(Range::min, other.GetMax())) && Math::Utils::all(Math::Utils::greaterThanEqual(Range::max, other.GetMin())); } [[nodiscard]] bool InBounds(const T& position) const diff --git a/openVulkanoCpp/Scene/Ray.cpp b/openVulkanoCpp/Scene/Ray.cpp index 29f6308..49d9679 100644 --- a/openVulkanoCpp/Scene/Ray.cpp +++ b/openVulkanoCpp/Scene/Ray.cpp @@ -170,31 +170,34 @@ namespace OpenVulkano::Scene if (roots == 0) return 0; SortPair(x1, x2); - + bool calcP2 = false; if (roots == 1) { if (x1 < 0) return 0; // ray intersects sphere behind the origin - p2 = p1; } else { if (x1 < 0 && x2 < 0) return 0; // ray intersects sphere behind the origin if (x1 >= 0 && x2 >= 0) { - p2.point = m_origin + x2 * m_dir; - p2.distance2 = distance2(m_origin, p2.point); - p2.normal = normalize(p2.point - center); + calcP2 = true; } else { --roots; if (x1 < 0) x1 = x2; - p2 = p1; } } p1.point = m_origin + x1 * m_dir; p1.distance2 = distance2(m_origin, p1.point); p1.normal = normalize(p1.point - center); + if (calcP2) + { + p2.point = m_origin + x2 * m_dir; + p2.distance2 = distance2(m_origin, p2.point); + p2.normal = normalize(p2.point - center); + } + else p2 = p1; return roots; }