From 74d396a376069a4b284f0aab54a6af4cff8c4558 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 22 Aug 2013 10:50:53 +0200 Subject: [PATCH] Added warning when clip matrix is not invertible Former-commit-id: 4707faab0259062ad619a5e5c72fcbbfaf853e3c --- include/Nazara/Math/Frustum.inl | 88 +++++++++++++++++---------------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/include/Nazara/Math/Frustum.inl b/include/Nazara/Math/Frustum.inl index 5eab90919..e3436c1e3 100644 --- a/include/Nazara/Math/Frustum.inl +++ b/include/Nazara/Math/Frustum.inl @@ -263,64 +263,68 @@ NzFrustum& NzFrustum::Extract(const NzMatrix4& clipMatrix) // Je me base sur cette page: http://www.gamedev.net/topic/393309-calculating-the-view-frustums-vertices/ NzMatrix4f invClipMatrix; - clipMatrix.GetInverse(&invClipMatrix); - NzVector4f corner; + if (clipMatrix.GetInverse(&invClipMatrix)) + { + NzVector4f corner; - // FarLeftBottom - corner.Set(F(-1.0), F(-1.0), F(1.0)); - corner = invClipMatrix.Transform(corner); - corner.Normalize(); + // FarLeftBottom + corner.Set(F(-1.0), F(-1.0), F(1.0)); + corner = invClipMatrix.Transform(corner); + corner.Normalize(); - m_corners[nzCorner_FarLeftBottom] = NzVector3(corner.x, corner.y, corner.z); + m_corners[nzCorner_FarLeftBottom] = NzVector3(corner.x, corner.y, corner.z); - // FarLeftTop - corner.Set(F(-1.0), F(1.0), F(1.0)); - corner = invClipMatrix.Transform(corner); - corner.Normalize(); + // FarLeftTop + corner.Set(F(-1.0), F(1.0), F(1.0)); + corner = invClipMatrix.Transform(corner); + corner.Normalize(); - m_corners[nzCorner_FarLeftTop] = NzVector3(corner.x, corner.y, corner.z); + m_corners[nzCorner_FarLeftTop] = NzVector3(corner.x, corner.y, corner.z); - // FarRightBottom - corner.Set(F(1.0), F(-1.0), F(1.0)); - corner = invClipMatrix.Transform(corner); - corner.Normalize(); + // FarRightBottom + corner.Set(F(1.0), F(-1.0), F(1.0)); + corner = invClipMatrix.Transform(corner); + corner.Normalize(); - m_corners[nzCorner_FarRightBottom] = NzVector3(corner.x, corner.y, corner.z); + m_corners[nzCorner_FarRightBottom] = NzVector3(corner.x, corner.y, corner.z); - // FarRightTop - corner.Set(F(1.0), F(1.0), F(1.0)); - corner = invClipMatrix.Transform(corner); - corner.Normalize(); + // FarRightTop + corner.Set(F(1.0), F(1.0), F(1.0)); + corner = invClipMatrix.Transform(corner); + corner.Normalize(); - m_corners[nzCorner_FarRightTop] = NzVector3(corner.x, corner.y, corner.z); + m_corners[nzCorner_FarRightTop] = NzVector3(corner.x, corner.y, corner.z); - // NearLeftBottom - corner.Set(F(-1.0), F(-1.0), F(0.0)); - corner = invClipMatrix.Transform(corner); - corner.Normalize(); + // NearLeftBottom + corner.Set(F(-1.0), F(-1.0), F(0.0)); + corner = invClipMatrix.Transform(corner); + corner.Normalize(); - m_corners[nzCorner_NearLeftBottom] = NzVector3(corner.x, corner.y, corner.z); + m_corners[nzCorner_NearLeftBottom] = NzVector3(corner.x, corner.y, corner.z); - // NearLeftTop - corner.Set(F(-1.0), F(1.0), F(0.0)); - corner = invClipMatrix.Transform(corner); - corner.Normalize(); + // NearLeftTop + corner.Set(F(-1.0), F(1.0), F(0.0)); + corner = invClipMatrix.Transform(corner); + corner.Normalize(); - m_corners[nzCorner_NearLeftTop] = NzVector3(corner.x, corner.y, corner.z); + m_corners[nzCorner_NearLeftTop] = NzVector3(corner.x, corner.y, corner.z); - // NearRightBottom - corner.Set(F(1.0), F(-1.0), F(0.0)); - corner = invClipMatrix.Transform(corner); - corner.Normalize(); + // NearRightBottom + corner.Set(F(1.0), F(-1.0), F(0.0)); + corner = invClipMatrix.Transform(corner); + corner.Normalize(); - m_corners[nzCorner_NearRightBottom] = NzVector3(corner.x, corner.y, corner.z); + m_corners[nzCorner_NearRightBottom] = NzVector3(corner.x, corner.y, corner.z); - // NearRightTop - corner.Set(F(1.0), F(1.0), F(0.0)); - corner = invClipMatrix.Transform(corner); - corner.Normalize(); + // NearRightTop + corner.Set(F(1.0), F(1.0), F(0.0)); + corner = invClipMatrix.Transform(corner); + corner.Normalize(); - m_corners[nzCorner_NearRightTop] = NzVector3(corner.x, corner.y, corner.z); + m_corners[nzCorner_NearRightTop] = NzVector3(corner.x, corner.y, corner.z); + } + else + NazaraWarning("Clip matrix is not invertible, failed to compute frustum corners"); return *this; }