Added warning when clip matrix is not invertible
Former-commit-id: 4707faab0259062ad619a5e5c72fcbbfaf853e3c
This commit is contained in:
parent
5d0ed4f27c
commit
74d396a376
|
|
@ -263,64 +263,68 @@ NzFrustum<T>& NzFrustum<T>::Extract(const NzMatrix4<T>& clipMatrix)
|
||||||
// Je me base sur cette page: http://www.gamedev.net/topic/393309-calculating-the-view-frustums-vertices/
|
// Je me base sur cette page: http://www.gamedev.net/topic/393309-calculating-the-view-frustums-vertices/
|
||||||
|
|
||||||
NzMatrix4f invClipMatrix;
|
NzMatrix4f invClipMatrix;
|
||||||
clipMatrix.GetInverse(&invClipMatrix);
|
if (clipMatrix.GetInverse(&invClipMatrix))
|
||||||
NzVector4f corner;
|
{
|
||||||
|
NzVector4f corner;
|
||||||
|
|
||||||
// FarLeftBottom
|
// FarLeftBottom
|
||||||
corner.Set(F(-1.0), F(-1.0), F(1.0));
|
corner.Set(F(-1.0), F(-1.0), F(1.0));
|
||||||
corner = invClipMatrix.Transform(corner);
|
corner = invClipMatrix.Transform(corner);
|
||||||
corner.Normalize();
|
corner.Normalize();
|
||||||
|
|
||||||
m_corners[nzCorner_FarLeftBottom] = NzVector3<T>(corner.x, corner.y, corner.z);
|
m_corners[nzCorner_FarLeftBottom] = NzVector3<T>(corner.x, corner.y, corner.z);
|
||||||
|
|
||||||
// FarLeftTop
|
// FarLeftTop
|
||||||
corner.Set(F(-1.0), F(1.0), F(1.0));
|
corner.Set(F(-1.0), F(1.0), F(1.0));
|
||||||
corner = invClipMatrix.Transform(corner);
|
corner = invClipMatrix.Transform(corner);
|
||||||
corner.Normalize();
|
corner.Normalize();
|
||||||
|
|
||||||
m_corners[nzCorner_FarLeftTop] = NzVector3<T>(corner.x, corner.y, corner.z);
|
m_corners[nzCorner_FarLeftTop] = NzVector3<T>(corner.x, corner.y, corner.z);
|
||||||
|
|
||||||
// FarRightBottom
|
// FarRightBottom
|
||||||
corner.Set(F(1.0), F(-1.0), F(1.0));
|
corner.Set(F(1.0), F(-1.0), F(1.0));
|
||||||
corner = invClipMatrix.Transform(corner);
|
corner = invClipMatrix.Transform(corner);
|
||||||
corner.Normalize();
|
corner.Normalize();
|
||||||
|
|
||||||
m_corners[nzCorner_FarRightBottom] = NzVector3<T>(corner.x, corner.y, corner.z);
|
m_corners[nzCorner_FarRightBottom] = NzVector3<T>(corner.x, corner.y, corner.z);
|
||||||
|
|
||||||
// FarRightTop
|
// FarRightTop
|
||||||
corner.Set(F(1.0), F(1.0), F(1.0));
|
corner.Set(F(1.0), F(1.0), F(1.0));
|
||||||
corner = invClipMatrix.Transform(corner);
|
corner = invClipMatrix.Transform(corner);
|
||||||
corner.Normalize();
|
corner.Normalize();
|
||||||
|
|
||||||
m_corners[nzCorner_FarRightTop] = NzVector3<T>(corner.x, corner.y, corner.z);
|
m_corners[nzCorner_FarRightTop] = NzVector3<T>(corner.x, corner.y, corner.z);
|
||||||
|
|
||||||
// NearLeftBottom
|
// NearLeftBottom
|
||||||
corner.Set(F(-1.0), F(-1.0), F(0.0));
|
corner.Set(F(-1.0), F(-1.0), F(0.0));
|
||||||
corner = invClipMatrix.Transform(corner);
|
corner = invClipMatrix.Transform(corner);
|
||||||
corner.Normalize();
|
corner.Normalize();
|
||||||
|
|
||||||
m_corners[nzCorner_NearLeftBottom] = NzVector3<T>(corner.x, corner.y, corner.z);
|
m_corners[nzCorner_NearLeftBottom] = NzVector3<T>(corner.x, corner.y, corner.z);
|
||||||
|
|
||||||
// NearLeftTop
|
// NearLeftTop
|
||||||
corner.Set(F(-1.0), F(1.0), F(0.0));
|
corner.Set(F(-1.0), F(1.0), F(0.0));
|
||||||
corner = invClipMatrix.Transform(corner);
|
corner = invClipMatrix.Transform(corner);
|
||||||
corner.Normalize();
|
corner.Normalize();
|
||||||
|
|
||||||
m_corners[nzCorner_NearLeftTop] = NzVector3<T>(corner.x, corner.y, corner.z);
|
m_corners[nzCorner_NearLeftTop] = NzVector3<T>(corner.x, corner.y, corner.z);
|
||||||
|
|
||||||
// NearRightBottom
|
// NearRightBottom
|
||||||
corner.Set(F(1.0), F(-1.0), F(0.0));
|
corner.Set(F(1.0), F(-1.0), F(0.0));
|
||||||
corner = invClipMatrix.Transform(corner);
|
corner = invClipMatrix.Transform(corner);
|
||||||
corner.Normalize();
|
corner.Normalize();
|
||||||
|
|
||||||
m_corners[nzCorner_NearRightBottom] = NzVector3<T>(corner.x, corner.y, corner.z);
|
m_corners[nzCorner_NearRightBottom] = NzVector3<T>(corner.x, corner.y, corner.z);
|
||||||
|
|
||||||
// NearRightTop
|
// NearRightTop
|
||||||
corner.Set(F(1.0), F(1.0), F(0.0));
|
corner.Set(F(1.0), F(1.0), F(0.0));
|
||||||
corner = invClipMatrix.Transform(corner);
|
corner = invClipMatrix.Transform(corner);
|
||||||
corner.Normalize();
|
corner.Normalize();
|
||||||
|
|
||||||
m_corners[nzCorner_NearRightTop] = NzVector3<T>(corner.x, corner.y, corner.z);
|
m_corners[nzCorner_NearRightTop] = NzVector3<T>(corner.x, corner.y, corner.z);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
NazaraWarning("Clip matrix is not invertible, failed to compute frustum corners");
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue