mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-06 17:41:04 +00:00
matrix4.h: Extract & expose determinant
This commit is contained in:
parent
1f9a3b5875
commit
a87ce1bad7
1 changed files with 16 additions and 6 deletions
|
@ -276,6 +276,8 @@ public:
|
||||||
/** \param out: where result matrix is written to. */
|
/** \param out: where result matrix is written to. */
|
||||||
bool getInversePrimitive(CMatrix4<T> &out) const;
|
bool getInversePrimitive(CMatrix4<T> &out) const;
|
||||||
|
|
||||||
|
T determinant() const;
|
||||||
|
|
||||||
//! Gets the inverse matrix of this one
|
//! Gets the inverse matrix of this one
|
||||||
/** \param out: where result matrix is written to.
|
/** \param out: where result matrix is written to.
|
||||||
\return Returns false if there is no inverse matrix. */
|
\return Returns false if there is no inverse matrix. */
|
||||||
|
@ -1067,6 +1069,19 @@ inline void CMatrix4<T>::translateVect(vector3df &vect) const
|
||||||
vect.Z = vect.Z + M[14];
|
vect.Z = vect.Z + M[14];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
inline T CMatrix4<T>::determinant() const
|
||||||
|
{
|
||||||
|
// Calculates the determinant using the rule of Sarrus.
|
||||||
|
const CMatrix4<T> &m = *this;
|
||||||
|
return (m[0] * m[5] - m[1] * m[4]) * (m[10] * m[15] - m[11] * m[14]) -
|
||||||
|
(m[0] * m[6] - m[2] * m[4]) * (m[9] * m[15] - m[11] * m[13]) +
|
||||||
|
(m[0] * m[7] - m[3] * m[4]) * (m[9] * m[14] - m[10] * m[13]) +
|
||||||
|
(m[1] * m[6] - m[2] * m[5]) * (m[8] * m[15] - m[11] * m[12]) -
|
||||||
|
(m[1] * m[7] - m[3] * m[5]) * (m[8] * m[14] - m[10] * m[12]) +
|
||||||
|
(m[2] * m[7] - m[3] * m[6]) * (m[8] * m[13] - m[9] * m[12]);
|
||||||
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
inline bool CMatrix4<T>::getInverse(CMatrix4<T> &out) const
|
inline bool CMatrix4<T>::getInverse(CMatrix4<T> &out) const
|
||||||
{
|
{
|
||||||
|
@ -1076,12 +1091,7 @@ inline bool CMatrix4<T>::getInverse(CMatrix4<T> &out) const
|
||||||
|
|
||||||
const CMatrix4<T> &m = *this;
|
const CMatrix4<T> &m = *this;
|
||||||
|
|
||||||
f32 d = (m[0] * m[5] - m[1] * m[4]) * (m[10] * m[15] - m[11] * m[14]) -
|
f32 d = determinant();
|
||||||
(m[0] * m[6] - m[2] * m[4]) * (m[9] * m[15] - m[11] * m[13]) +
|
|
||||||
(m[0] * m[7] - m[3] * m[4]) * (m[9] * m[14] - m[10] * m[13]) +
|
|
||||||
(m[1] * m[6] - m[2] * m[5]) * (m[8] * m[15] - m[11] * m[12]) -
|
|
||||||
(m[1] * m[7] - m[3] * m[5]) * (m[8] * m[14] - m[10] * m[12]) +
|
|
||||||
(m[2] * m[7] - m[3] * m[6]) * (m[8] * m[13] - m[9] * m[12]);
|
|
||||||
|
|
||||||
if (iszero(d, FLT_MIN))
|
if (iszero(d, FLT_MIN))
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue