OpenBarnyard
 
Loading...
Searching...
No Matches
TMatrix44.cpp
Go to the documentation of this file.
1#include "ToshiPCH.h"
2#include "TMatrix44.h"
3
5
7 1.0f,
8 0.0f,
9 0.0f,
10 0.0f,
11 0.0f,
12 1.0f,
13 0.0f,
14 0.0f,
15 0.0f,
16 0.0f,
17 1.0f,
18 0.0f,
19 0.0f,
20 0.0f,
21 0.0f,
22 1.0f
23);
24
25void TMatrix44::LookAtTarget( const TVector4& target, const TVector4& up )
26{
27 auto& forward = AsBasisVector3( 2 );
28
29 forward = target.AsVector3() - up.AsVector3();
30 forward.Normalize();
31
32 AsBasisVector3( 0 ) = { m_f33, 0, -m_f31 };
34
35 m_f22 = m_f11 * m_f33 - m_f13 * m_f31;
36 m_f23 = m_f12 * m_f31 - m_f11 * m_f32;
37 m_f21 = m_f13 * m_f32 - m_f12 * m_f33;
38}
39
40// $Barnyard: FUNCTION 006c8970
41void TMatrix44::LookAtDirection( const Toshi::TVector4& a_rDirection, const Toshi::TVector4& a_rUpAxis )
42{
43 TVector4 vProjection;
44 TVector4 vCrossProduct;
45
46 vProjection.ProjectNormalToPlane( a_rUpAxis, a_rDirection );
47 vProjection.Multiply( -1.0f );
48 vCrossProduct.CrossProduct( vProjection, a_rDirection );
49
50 AsBasisVector4( 0 ) = vCrossProduct;
51 AsBasisVector4( 0 ).w = 0.0f;
52
53 AsBasisVector4( 1 ) = vProjection;
54 AsBasisVector4( 1 ).w = 0.0f;
55
56 AsBasisVector4( 2 ) = a_rDirection;
57 AsBasisVector4( 2 ).w = 0.0f;
58}
59
60// $Barnyard: FUNCTION 006c85f0
61void TMatrix44::Multiply( const TMatrix44& a_rLeft, const TMatrix44& a_rRight )
62{
63 TASSERT( ( this != &a_rLeft ) && ( this != &a_rRight ) );
64
65 for ( TINT i = 0; i < 4; i++ )
66 {
67 TFLOAT* pBasis = AsBasisVector4( i ).AsArray();
68
69 for ( TINT k = 0; k < 4; k++ )
70 {
71 pBasis[ k ] =
72 a_rLeft.AsBasisVector4( 3 ).AsArray()[ k ] * a_rRight.AsBasisVector4( i ).w +
73 a_rLeft.AsBasisVector4( 2 ).AsArray()[ k ] * a_rRight.AsBasisVector4( i ).z +
74 a_rLeft.AsBasisVector4( 1 ).AsArray()[ k ] * a_rRight.AsBasisVector4( i ).y +
75 a_rLeft.AsBasisVector4( 0 ).AsArray()[ k ] * a_rRight.AsBasisVector4( i ).x;
76 }
77 }
78}
79
80// $Barnyard: FUNCTION 0041fb30
81void TMatrix44::Multiply( const TMatrix44& a_rRight )
82{
83 TMatrix44 temp = *this;
84 Multiply( temp, a_rRight );
85}
86
87// $Barnyard: FUNCTION 006c8ef0
89{
90 TASSERT( a_rRight.m_f14 == 0.0f );
91 TASSERT( a_rRight.m_f24 == 0.0f );
92 TASSERT( a_rRight.m_f34 == 0.0f );
93 TASSERT( a_rRight.m_f44 == 1.0f );
94
95 TFLOAT fVar1;
96 TFLOAT fVar2;
97 TFLOAT fVar3;
98 TFLOAT fVar4;
99
100 fVar1 = a_rRight.m_f22 * a_rRight.m_f33 - a_rRight.m_f32 * a_rRight.m_f23;
101 fVar4 = -( a_rRight.m_f33 * a_rRight.m_f12 - a_rRight.m_f32 * a_rRight.m_f13 );
102 fVar3 = a_rRight.m_f23 * a_rRight.m_f12 - a_rRight.m_f22 * a_rRight.m_f13;
103 fVar2 = fVar4 * a_rRight.m_f21 + fVar1 * a_rRight.m_f11 + fVar3 * a_rRight.m_f31;
104
105 if ( fVar2 == 0.0 )
106 return TFALSE;
107
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 );
110 RotateVector( AsBasisVector4( 3 ), *this, AsBasisVector4( 3 ) );
111
112 return TTRUE;
113}
114
115// $Barnyard: FUNCTION 006c9050
117{
118 TASSERT( a_rRight.m_f14 == 0.0f );
119 TASSERT( a_rRight.m_f24 == 0.0f );
120 TASSERT( a_rRight.m_f34 == 0.0f );
121 TASSERT( a_rRight.m_f44 == 1.0f );
122
123 TFLOAT fVar7 = a_rRight.m_f13;
124 TFLOAT fVar1 = a_rRight.m_f44;
125 TFLOAT fVar2 = a_rRight.m_f43;
126 TFLOAT fVar8 = a_rRight.m_f24;
127 TFLOAT fVar3 = a_rRight.m_f42;
128 TFLOAT fVar9 = a_rRight.m_f32;
129 TFLOAT fVar4 = a_rRight.m_f41;
130 TFLOAT fVar10 = a_rRight.m_f22;
131 TFLOAT fVar5 = a_rRight.m_f34;
132 TFLOAT fVar11 = a_rRight.m_f12;
133 TFLOAT fVar6 = a_rRight.m_f33;
134 TFLOAT fVar12 = a_rRight.m_f14;
135 TFLOAT fVar13 = a_rRight.m_f31;
136 TFLOAT fVar14 = a_rRight.m_f21;
137 TFLOAT fVar15 = a_rRight.m_f11;
138
139 m_f32 = a_rRight.m_f23;
140 m_f11 = fVar15;
141 m_f33 = fVar6;
142 m_f13 = fVar13;
143 m_f34 = fVar5;
144 m_f21 = fVar11;
145 m_f41 = -fVar4;
146 m_f23 = fVar9;
147 m_f42 = -fVar3;
148 m_f31 = fVar7;
149 m_f43 = -fVar2;
150 m_f12 = fVar14;
151 m_f44 = fVar1;
152 m_f14 = fVar12;
153 m_f22 = fVar10;
154 m_f24 = fVar8;
155 RotateVector( AsBasisVector4( 3 ), *this, AsBasisVector4( 3 ) );
156}
157
158// $Barnyard: FUNCTION 006c9110
160{
161 InvertOrthogonal( *this );
162}
163
165{
167
168 std::swap( m_f12, m_f21 );
169 std::swap( m_f13, m_f31 );
170 std::swap( m_f23, m_f32 );
171
172 m_f42 *= -1;
173 m_f41 *= -1;
174 m_f43 *= -1;
175 m_f42 = m_f22 * m_f42 + m_f41 * m_f12 + m_f43 * m_f32;
176 m_f43 = m_f42 * m_f23 + m_f41 * m_f13 + m_f33 * m_f43;
177 m_f41 = m_f42 * m_f21 + m_f41 * m_f11 + m_f43 * m_f31;
178}
179
180// $Barnyard: FUNCTION 006c8d90
182{
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;
188
189 m_f14 = 0.0f;
190 m_f24 = 0.0f;
191 m_f34 = 0.0f;
192 m_f41 = 0.0f;
193 m_f42 = 0.0f;
194 m_f43 = 0.0f;
195 m_f44 = 1.0f;
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 );
205
206 return *this;
207}
208
209// $Barnyard: FUNCTION 006c8ea0
210TMatrix44& TMatrix44::PushQuaternion( const TQuaternion& a_rQuaternion, const TMatrix44& a_rMatrix, const TVector3& a_rOrigin )
211{
212 TMatrix44 matrix;
213
214 matrix.SetFromQuaternion( a_rQuaternion );
215 matrix.AsBasisVector3( 3 ) = a_rOrigin;
216 Multiply( a_rMatrix, matrix );
217
218 return *this;
219}
220
221// $Barnyard: FUNCTION 006c8840
223{
224 TFLOAT fVar1;
225 TFLOAT fVar2;
226 TFLOAT fCos;
227 TFLOAT fSin;
228
229 TMath::SinCos( angle, fSin, fCos );
230 fVar1 = m_f31;
231 m_f31 = fVar1 * fCos - m_f21 * fSin;
232 fVar2 = m_f32;
233 m_f21 = fVar1 * fSin + m_f21 * fCos;
234 fVar1 = m_f23;
235 m_f32 = fVar2 * fCos - m_f22 * fSin;
236 m_f22 = fVar2 * fSin + m_f22 * fCos;
237 m_f23 = m_f33 * fSin + fVar1 * fCos;
238 m_f33 = m_f33 * fCos - fVar1 * fSin;
239}
240
241// $Barnyard: FUNCTION 006c88e0
243{
244 TFLOAT fVar1;
245 TFLOAT fVar2;
246 TFLOAT fSin;
247 TFLOAT fCos;
248
249 TMath::SinCos( angle, fSin, fCos );
250 fVar1 = m_f31;
251 m_f31 = fVar1 * fCos + m_f11 * fSin;
252 fVar2 = m_f32;
253 m_f11 = m_f11 * fCos - fVar1 * fSin;
254 fVar1 = m_f13;
255 m_f32 = fVar2 * fCos + m_f12 * fSin;
256 m_f12 = m_f12 * fCos - fVar2 * fSin;
257 m_f13 = fVar1 * fCos - m_f33 * fSin;
258 m_f33 = m_f33 * fCos + fVar1 * fSin;
259}
260
261// $Barnyard: FUNCTION 006c87b0
263{
264 TFLOAT fVar1;
265 TFLOAT fVar2;
266 TFLOAT fCos;
267 TFLOAT fSin;
268
269 TMath::SinCos( angle, fSin, fCos );
270 fVar1 = m_f21;
271 m_f21 = fVar1 * fCos - m_f11 * fSin;
272 fVar2 = m_f22;
273 m_f11 = fVar1 * fSin + m_f11 * fCos;
274 fVar1 = m_f13;
275 m_f22 = fVar2 * fCos - m_f12 * fSin;
276 m_f12 = fVar2 * fSin + m_f12 * fCos;
277 m_f13 = m_f23 * fSin + fVar1 * fCos;
278 m_f23 = m_f23 * fCos - fVar1 * fSin;
279}
280
281// $Barnyard: FUNCTION 005e7bb0
282void TMatrix44::GetEulerXYZ( TVector3& a_rOutVec ) const
283{
284 TFLOAT fVal1 = m_f31;
285 TMath::Clip( fVal1, -1.0f, 1.0f );
286
287 TFLOAT fVal2 = TMath::Sqrt( 1.0f - fVal1 * fVal1 );
288
289 if ( m_f11 < 0 && m_f33 < 0 )
290 fVal2 *= -1;
291
292 if ( 0.001f < fVal2 || fVal2 < -0.001 )
293 {
294 TFLOAT fVal3 = 1.0f / fVal2;
295
296 a_rOutVec.x = TMath::ATan2( m_f32 * fVal3, m_f33 * fVal3 );
297 a_rOutVec.y = TMath::ATan2( fVal1, fVal2 );
298 a_rOutVec.z = TMath::ATan2( m_f21 * fVal3, m_f11 * fVal3 );
299 }
300 else
301 {
302 a_rOutVec.x = TMath::ATan2( -m_f32, m_f22 );
303 a_rOutVec.y = -TMath::ASin( fVal1 );
304 a_rOutVec.z = 0.0f;
305 }
306}
307
4x4 matrix implementation for the Toshi engine
#define TASSERT(X,...)
Definition Defines.h:138
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
float TFLOAT
Definition Typedefs.h:4
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
TFORCEINLINE void SinCos(TFLOAT fVal, TFLOAT &a_rSin, TFLOAT &a_rCos)
TFORCEINLINE TFLOAT ATan2(TFLOAT fVal1, TFLOAT fVal2)
Definition TMathInline.h:57
TFORCEINLINE void Clip(T &rVal, const T &Min, const T &Max)
TFORCEINLINE TFLOAT Sqrt(TFLOAT a_fX)
Definition TMathInline.h:84
TFORCEINLINE TFLOAT ASin(TFLOAT fVal)
Definition TMathInline.h:47
void RotateZ(TFLOAT a_fAngle)
constexpr TBOOL IsOrthonormal() const
Definition TMatrix44.h:208
TFLOAT m_f21
Definition TMatrix44.h:361
void RotateX(TFLOAT a_fAngle)
TFLOAT m_f12
Definition TMatrix44.h:360
void LookAtTarget(const TVector4 &a_rTarget, const TVector4 &a_rUp)
Definition TMatrix44.cpp:25
TBOOL Invert(const TMatrix44 &a_rRight)
Definition TMatrix44.cpp:88
TFLOAT m_f44
Definition TMatrix44.h:363
void LookAtDirection(const TVector4 &a_rVec, const TVector4 &a_rVec2)
Definition TMatrix44.cpp:41
TFLOAT m_f43
Definition TMatrix44.h:363
TFLOAT m_f32
Definition TMatrix44.h:362
void InvertOrthonormal()
TFLOAT m_f13
Definition TMatrix44.h:360
static constinit TMatrix44 IDENTITY
Definition TMatrix44.h:357
TFLOAT m_f14
Definition TMatrix44.h:360
const TVector3 & AsBasisVector3(BASISVECTOR a_iIndex) const
Definition TMatrix44.h:115
TFLOAT m_f11
Definition TMatrix44.h:360
TFLOAT m_f23
Definition TMatrix44.h:361
void InvertOrthogonal()
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)
Definition TMatrix44.h:62
static constexpr void RotateVector(TVector4 &a_rOutVector, const TMatrix44 &a_rMatrix, const TVector4 &a_rVector)
Definition TMatrix44.h:252
void RotateY(TFLOAT a_fAngle)
constexpr TMatrix44()=default
TFLOAT m_f22
Definition TMatrix44.h:361
TFLOAT m_f41
Definition TMatrix44.h:363
TFLOAT m_f31
Definition TMatrix44.h:362
void GetEulerXYZ(TVector3 &a_rOutVec) const
TFLOAT m_f24
Definition TMatrix44.h:361
const TVector4 & AsBasisVector4(BASISVECTOR a_iIndex) const
Definition TMatrix44.h:131
TMatrix44 & SetFromQuaternion(const TQuaternion &a_rQuaternion)
TFLOAT m_f34
Definition TMatrix44.h:362
void Multiply(const TMatrix44 &a_rLeft, const TMatrix44 &a_rRight)
Definition TMatrix44.cpp:61
TFLOAT m_f42
Definition TMatrix44.h:363
TFLOAT m_f33
Definition TMatrix44.h:362
TFLOAT y
Definition TVector3.h:163
TFLOAT z
Definition TVector3.h:163
TFLOAT x
Definition TVector3.h:163
void Normalize()
Definition TVector3.cpp:71
TFLOAT * AsArray()
Definition TVector4.h:318
TVector3 & AsVector3()
Definition TVector4.h:321
constexpr void Multiply(const TVector4 &vec)
Definition TVector4.h:170
void ProjectNormalToPlane(const TVector4 &vec, const TVector4 &vec2)
Definition TVector4.cpp:55
TFLOAT w
Definition TVector4.h:367
TFLOAT x
Definition TVector4.h:367
TFLOAT y
Definition TVector4.h:367
void CrossProduct(const TVector4 &vec1, const TVector4 &vec2)
Definition TVector4.h:223
TFLOAT z
Definition TVector4.h:367