63 TASSERT( (
this != &a_rLeft ) && (
this != &a_rRight ) );
65 for (
TINT i = 0; i < 4; i++ )
69 for (
TINT k = 0; k < 4; k++ )
103 fVar2 = fVar4 * a_rRight.
m_f21 + fVar1 * a_rRight.
m_f11 + fVar3 * a_rRight.
m_f31;
108 fVar2 = 1.0f / fVar2;
109 Set( fVar2 * fVar1, fVar4 * fVar2, fVar3 * fVar2, a_rRight.
m_f14, -( ( a_rRight.
m_f33 * a_rRight.
m_f21 - a_rRight.
m_f31 * a_rRight.
m_f23 ) * fVar2 ), ( a_rRight.
m_f11 * a_rRight.
m_f33 - a_rRight.
m_f31 * a_rRight.
m_f13 ) * fVar2, -( ( a_rRight.
m_f11 * a_rRight.
m_f23 - a_rRight.
m_f21 * a_rRight.
m_f13 ) * fVar2 ), a_rRight.
m_f24, ( a_rRight.
m_f32 * a_rRight.
m_f21 - a_rRight.
m_f31 * a_rRight.
m_f22 ) * fVar2, -( ( a_rRight.
m_f32 * a_rRight.
m_f11 - a_rRight.
m_f31 * a_rRight.
m_f12 ) * fVar2 ), ( a_rRight.
m_f22 * a_rRight.
m_f11 - a_rRight.
m_f21 * a_rRight.
m_f12 ) * fVar2, a_rRight.
m_f34, -a_rRight.
m_f41, -a_rRight.
m_f42, -a_rRight.
m_f43, a_rRight.
m_f44 );
183 TFLOAT fVal1 = a_rQuaternion.
z * 2.0f;
184 TFLOAT fVal2 = a_rQuaternion.
y * 2.0f;
185 TFLOAT fVal3 = a_rQuaternion.
x * 2.0f * a_rQuaternion.
w;
186 TFLOAT fVal4 = a_rQuaternion.
x * 2.0f * a_rQuaternion.
x;
187 TFLOAT fVal5 = fVal1 * a_rQuaternion.
z;
196 m_f11 = 1.0f - ( fVal5 + fVal2 * a_rQuaternion.
y );
197 m_f21 = fVal2 * a_rQuaternion.
x - fVal1 * a_rQuaternion.
w;
198 m_f12 = fVal2 * a_rQuaternion.
x + fVal1 * a_rQuaternion.
w;
199 m_f31 = fVal1 * a_rQuaternion.
x + fVal2 * a_rQuaternion.
w;
200 m_f13 = fVal1 * a_rQuaternion.
x - fVal2 * a_rQuaternion.
w;
201 m_f22 = 1.0f - ( fVal5 + fVal4 );
202 m_f32 = fVal1 * a_rQuaternion.
y - fVal3;
203 m_f23 = fVal1 * a_rQuaternion.
y + fVal3;
204 m_f33 = 1.0f - ( fVal2 * a_rQuaternion.
y + fVal4 );
292 if ( 0.001f < fVal2 || fVal2 < -0.001 )
294 TFLOAT fVal3 = 1.0f / fVal2;
4x4 matrix implementation for the Toshi engine
#define TOSHI_NAMESPACE_START
#define TOSHI_NAMESPACE_END
TFORCEINLINE void SinCos(TFLOAT fVal, TFLOAT &a_rSin, TFLOAT &a_rCos)
TFORCEINLINE TFLOAT ATan2(TFLOAT fVal1, TFLOAT fVal2)
TFORCEINLINE void Clip(T &rVal, const T &Min, const T &Max)
TFORCEINLINE TFLOAT Sqrt(TFLOAT a_fX)
TFORCEINLINE TFLOAT ASin(TFLOAT fVal)
void RotateZ(TFLOAT a_fAngle)
constexpr TBOOL IsOrthonormal() const
void RotateX(TFLOAT a_fAngle)
void LookAtTarget(const TVector4 &a_rTarget, const TVector4 &a_rUp)
TBOOL Invert(const TMatrix44 &a_rRight)
void LookAtDirection(const TVector4 &a_rVec, const TVector4 &a_rVec2)
static constinit TMatrix44 IDENTITY
const TVector3 & AsBasisVector3(BASISVECTOR a_iIndex) const
TMatrix44 & PushQuaternion(const TQuaternion &a_rQuaternion, const TMatrix44 &a_rMatrix, const TVector3 &a_rOrigin)
constexpr void Set(TFLOAT a_f11, TFLOAT a_f12, TFLOAT a_f13, TFLOAT a_f14, TFLOAT a_f21, TFLOAT a_f22, TFLOAT a_f23, TFLOAT a_f24, TFLOAT a_f31, TFLOAT a_f32, TFLOAT a_f33, TFLOAT a_f34, TFLOAT a_f41, TFLOAT a_f42, TFLOAT a_f43, TFLOAT a_f44)
static constexpr void RotateVector(TVector4 &a_rOutVector, const TMatrix44 &a_rMatrix, const TVector4 &a_rVector)
void RotateY(TFLOAT a_fAngle)
constexpr TMatrix44()=default
void GetEulerXYZ(TVector3 &a_rOutVec) const
const TVector4 & AsBasisVector4(BASISVECTOR a_iIndex) const
TMatrix44 & SetFromQuaternion(const TQuaternion &a_rQuaternion)
void Multiply(const TMatrix44 &a_rLeft, const TMatrix44 &a_rRight)
constexpr void Multiply(const TVector4 &vec)
void ProjectNormalToPlane(const TVector4 &vec, const TVector4 &vec2)
void CrossProduct(const TVector4 &vec1, const TVector4 &vec2)