From 9b2eb8ce3f60d1b9c2023bc2c67be8c3b3f2487f Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 26 Feb 2013 00:02:43 +0100 Subject: [PATCH] Optimized frustum tests against BoundingBox Former-commit-id: d923e5fa8c9b29dcaca1e0bffc28015ee96c4f30 --- include/Nazara/Math/Frustum.inl | 40 +++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/include/Nazara/Math/Frustum.inl b/include/Nazara/Math/Frustum.inl index 6c5b6325b..db5ac1810 100644 --- a/include/Nazara/Math/Frustum.inl +++ b/include/Nazara/Math/Frustum.inl @@ -71,7 +71,23 @@ bool NzFrustum::Contains(const NzBoundingBox& box) const switch (box.extend) { case nzExtend_Finite: - return Contains(box.aabb) && Contains(box.obb); + { + nzIntersectionSide side = Intersect(box.aabb); + switch (side) + { + case nzIntersectionSide_Inside: + return true; + + case nzIntersectionSide_Intersecting: + return Contains(box.obb); + + case nzIntersectionSide_Outside: + return false; + } + + NazaraError("Invalid intersection side (0x" + NzString::Number(side, 16) + ')'); + return false; + } case nzExtend_Infinite: return true; @@ -358,10 +374,26 @@ nzIntersectionSide NzFrustum::Intersect(const NzBoundingBox& box) const switch (box.extend) { case nzExtend_Finite: - return Intersect(box.aabb) && Intersect(box.obb); // Test de l'AABB et puis de l'OBB + { + nzIntersectionSide side = Intersect(box.aabb); + switch (side) + { + case nzIntersectionSide_Inside: + return nzIntersectionSide_Inside; + + case nzIntersectionSide_Intersecting: + return Intersect(box.obb); + + case nzIntersectionSide_Outside: + return nzIntersectionSide_Outside; + } + + NazaraError("Invalid intersection side (0x" + NzString::Number(side, 16) + ')'); + return false; + } case nzExtend_Infinite: - return nzIntersectionSide_Intersecting; + return nzIntersectionSide_Intersecting; // On ne peut pas contenir l'infini case nzExtend_Null: return nzIntersectionSide_Outside; @@ -381,7 +413,7 @@ nzIntersectionSide NzFrustum::Intersect(const NzCube& cube) const { if (m_planes[i].Distance(cube.GetPositiveVertex(m_planes[i].normal)) < F(0.0)) return nzIntersectionSide_Outside; - else if (m_planes[i].Distance(cube.GetNegativeVertex(m_planes[i].normal) < F(0.0))) + else if (m_planes[i].Distance(cube.GetNegativeVertex(m_planes[i].normal)) < F(0.0)) side = nzIntersectionSide_Intersecting; }