From 532b1b2c4dafd4bcac1c2ebe62b1992a338b219c Mon Sep 17 00:00:00 2001 From: SirLynix Date: Fri, 25 Aug 2023 17:13:07 +0200 Subject: [PATCH] Math/Frustum: Add ComputeCorners and GetAABB --- include/Nazara/Math/Frustum.hpp | 2 ++ include/Nazara/Math/Frustum.inl | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/include/Nazara/Math/Frustum.hpp b/include/Nazara/Math/Frustum.hpp index cd4be1780..a9663f91a 100644 --- a/include/Nazara/Math/Frustum.hpp +++ b/include/Nazara/Math/Frustum.hpp @@ -37,6 +37,7 @@ namespace Nz constexpr bool ApproxEqual(const Frustum& frustum, T maxDifference = std::numeric_limits::epsilon()) const; constexpr Vector3 ComputeCorner(BoxCorner corner) const; + constexpr EnumArray> ComputeCorners() const; constexpr bool Contains(const BoundingVolume& volume) const; constexpr bool Contains(const Box& box) const; @@ -45,6 +46,7 @@ namespace Nz constexpr bool Contains(const Vector3& point) const; constexpr bool Contains(const Vector3* points, std::size_t pointCount) const; + constexpr const Box& GetAABB() const; constexpr const Plane& GetPlane(FrustumPlane plane) const; constexpr const EnumArray>& GetPlanes() const; diff --git a/include/Nazara/Math/Frustum.inl b/include/Nazara/Math/Frustum.inl index 92595614c..fee6ad71b 100644 --- a/include/Nazara/Math/Frustum.inl +++ b/include/Nazara/Math/Frustum.inl @@ -85,6 +85,21 @@ namespace Nz return Vector3(); } + template + constexpr EnumArray> Frustum::ComputeCorners() const + { + return { + ComputeCorner(BoxCorner::FarLeftBottom), + ComputeCorner(BoxCorner::FarLeftTop), + ComputeCorner(BoxCorner::FarRightBottom), + ComputeCorner(BoxCorner::FarRightTop), + ComputeCorner(BoxCorner::NearLeftBottom), + ComputeCorner(BoxCorner::NearLeftTop), + ComputeCorner(BoxCorner::NearRightBottom), + ComputeCorner(BoxCorner::NearRightTop) + }; + } + /*! * \brief Checks whether or not a bounding volume is contained in the frustum * \return true if the bounding volume is entirely in the frustum @@ -229,6 +244,22 @@ namespace Nz return true; } + template + constexpr const Box& Frustum::GetAABB() const + { + EnumArray> corners = ComputeCorners(); + + Vector3f max = corners.front(); + Vector3f min = corners.front(); + for (std::size_t i = 1; i < corners.size(); ++i) + { + max.Maximize(corners[static_cast(i)]); + min.Minimize(corners[static_cast(i)]); + } + + return Box::FromExtends(min, max); + } + /*! * \brief Gets the Plane for the face * \return The face of the frustum according to enum FrustumPlane