NW4F Sys
Loading...
Searching...
No Matches
math_Matrix34.h
Go to the documentation of this file.
1#ifndef NW_MATH_MATRIX34_H_
2#define NW_MATH_MATRIX34_H_
3
4#include <cstring>
5#include <nw/math/math_Config.h>
6
7namespace nw { namespace math {
8
9struct MTX34;
10
11namespace internal { namespace standard {
12
13 VEC3* VEC3Transform(VEC3* pOut, const MTX34* pM, const VEC3* pV);
14 MTX34* MTX34Add(MTX34* pOut, const MTX34* p1, const MTX34* p2);
15 MTX34* MTX34Sub(MTX34* pOut, const MTX34* p1, const MTX34* p2);
16 MTX34* MTX34MultScale(MTX34* pOut, const MTX34* pM, const VEC3* pS);
17 MTX34* MTX34MultScale(MTX34* pOut, const VEC3* pS, const MTX34* pM);
18 MTX34* MTX34Mult(MTX34* pOut, const MTX34* p, f32 f);
19 MTX34* MTX34MAdd(MTX34* pOut, f32 t, const MTX34* p1, const MTX34* p2);
20 MTX34* MTX34Mult(MTX34* pOut, const MTX34* p1, const MTX34* p2);
21 u32 MTX34Inverse(MTX34* pOut, const MTX34* p);
22 u32 MTX34InvTranspose(MTX34* pOut, const MTX34* p);
23
24} } // namespace internal::standard
25
26namespace internal { namespace intrinsics {
27
28 VEC3* VEC3Transform(VEC3* pOut, const MTX34* pM, const VEC3* pV);
29 MTX34* MTX34Add(MTX34* pOut, const MTX34* p1, const MTX34* p2);
30 MTX34* MTX34Sub(MTX34* pOut, const MTX34* p1, const MTX34* p2);
31 MTX34* MTX34MultScale(MTX34* pOut, const MTX34* pM, const VEC3* pS);
32 MTX34* MTX34MultScale(MTX34* pOut, const VEC3* pS, const MTX34* pM);
33 MTX34* MTX34Mult(MTX34* pOut, const MTX34* p, f32 f);
34 MTX34* MTX34MAdd(MTX34* pOut, f32 t, const MTX34* p1, const MTX34* p2);
35 MTX34* MTX34Mult(MTX34* pOut, const MTX34* p1, const MTX34* p2);
36 u32 MTX34Inverse(MTX34* pOut, const MTX34* p);
37 u32 MTX34InvTranspose(MTX34* pOut, const MTX34* p);
38
39} } // namespace internal::intrinsics
40
44// NW_MATH_INLINE MTX34* MTX34Copy(MTX34* pOut, const MTX34* p); <-- Redeclaration below
45
46NW_MATH_INLINE MTX34* MTX34Add(MTX34* pOut, const MTX34* p1, const MTX34* p2);
47NW_MATH_INLINE MTX34* MTX34Sub(MTX34* pOut, const MTX34* p1, const MTX34* p2);
48NW_MATH_INLINE MTX34* MTX34Mult(MTX34* pOut, const MTX34* p, f32 f);
49// NW_MATH_INLINE MTX34* MTX34Mult(MTX34* pOut, const MTX34* p1, const MTX34* p2); <-- Redeclaration below
50NW_MATH_INLINE MTX34* MTX34MAdd(MTX34* pOut, f32 t, const MTX34* p1, const MTX34* p2);
51
52NW_MATH_INLINE MTX34* MTX34MultArray(MTX34* pOut, const MTX34* p1, const MTX34* pSrc, s32 count);
56
57NW_MATH_INLINE MTX34* MTX34LookAt(MTX34* pOut, const VEC3* pCamPos, const VEC3* pCamUp, const VEC3* pTarget);
58NW_MATH_INLINE MTX34* MTX34LookAt(MTX34* pOut, const VEC3* pCamPos, f32 twist, const VEC3* pTarget);
59NW_MATH_INLINE MTX34* MTX34CameraRotate(MTX34* pOut, const VEC3* pCamPos, const VEC3* pCamRotate);
60
61NW_MATH_INLINE MTX34* MTX34TextureProjectionFrustum(MTX34* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT);
62NW_MATH_INLINE MTX34* MTX34TextureProjectionPerspective(MTX34* pOut, f32 fovy, f32 aspect, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT);
63NW_MATH_INLINE MTX34* MTX34TextureProjectionOrtho(MTX34* pOut, f32 l, f32 r, f32 b, f32 t, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT);
64
65NW_MATH_INLINE MTX34* MTX34RotXYZIdx(MTX34* pOut, u32 idxX, u32 idxY, u32 idxZ);
66NW_MATH_INLINE MTX34* MTX34RotXYZTranslateIdx(MTX34* pOut, u32 idxX, u32 idxY, u32 idxZ, const VEC3* pT);
67NW_MATH_INLINE MTX34* MTX34RotAxisIdx(MTX34* pOut, const VEC3* pAxis, u32 idx);
68
69NW_MATH_INLINE MTX34* MTX34Scale(MTX34* pOut, const VEC3* pS);
70NW_MATH_INLINE MTX34* MTX34MultScale(MTX34* pOut, const MTX34* pM, const VEC3* pS);
71NW_MATH_INLINE MTX34* MTX34MultScale(MTX34* pOut, const VEC3* pS, const MTX34* pM);
72
73NW_MATH_INLINE MTX34* MTX34Translate(MTX34* pOut, const VEC3* pT);
74NW_MATH_INLINE MTX34* MTX34MultTranslate(MTX34* pOut, const MTX34* pM, const VEC3* pT);
75NW_MATH_INLINE MTX34* MTX34MultTranslate(MTX34* pOut, const VEC3* pT, const MTX34* pM);
76
77NW_MATH_INLINE MTX34* MTX34MakeSRT(MTX34* pOut, const VEC3* pS, const VEC3* pR, const VEC3* pT);
78NW_MATH_INLINE MTX34* MTX34MakeST(MTX34* pOut, const VEC3* pS, const VEC3* pT);
79NW_MATH_INLINE MTX34* MTX34MakeS(MTX34* pOut, const VEC3* pS);
80
81NW_MATH_INLINE MTX34* QUATToMTX34(MTX34* pOut, const QUAT* p);
82
83NW_FORCE_INLINE MTX34* MTX34Copy(MTX34* pOut, const MTX34* p);
84NW_FORCE_INLINE MTX34* MTX34Mult(MTX34* pOut, const MTX34* p1, const MTX34* p2);
85
86#pragma clang diagnostic push
87#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
88
89inline MTX34*
90MTX34RotXYZRad(MTX34* pOut, f32 fRadX, f32 fRadY, f32 fRadZ)
91{
92 return MTX34RotXYZIdx(pOut, NW_MATH_RAD_TO_IDX(fRadX), NW_MATH_RAD_TO_IDX(fRadY), NW_MATH_RAD_TO_IDX(fRadZ));
93}
94
95inline MTX34*
96MTX34RotXYZDeg(MTX34* pOut, f32 fDegX, f32 fDegY, f32 fDegZ)
97{
98 return MTX34RotXYZIdx(pOut, NW_MATH_DEG_TO_IDX(fDegX), NW_MATH_DEG_TO_IDX(fDegY), NW_MATH_DEG_TO_IDX(fDegZ));
99}
100
101inline MTX34*
102MTX34RotAxisRad(MTX34* pOut, const VEC3* pAxis, f32 fRad)
103{
104 return MTX34RotAxisIdx(pOut, pAxis, NW_MATH_RAD_TO_IDX(fRad));
105}
106
107inline MTX34*
108MTX34RotAxisDeg(MTX34* pOut, const VEC3* pAxis, f32 fDeg)
109{
110 return MTX34RotAxisIdx(pOut, pAxis, NW_MATH_DEG_TO_IDX(fDeg));
111}
112struct MTX34_
113{
114 struct BaseData
115 {
119 };
120 union
121 {
122 struct
123 {
127 };
129 f32 m[3][4];
130 f32 a[12];
132 };
133};
134
135struct MTX34 : public MTX34_
136{
137public:
138 static const int ROW_COUNT = 3;
139 static const int COLUMN_COUNT = 4;
140
141 static const MTX34& Identity()
142 {
143 static const MTX34 identity(
144 1.0f, 0.0f, 0.0f, 0.0f,
145 0.0f, 1.0f, 0.0f, 0.0f,
146 0.0f, 0.0f, 1.0f, 0.0f);
147
148 return identity;
149 }
150
153public:
154 MTX34() {}
155
156 explicit MTX34(const f32* p) { (void)MTX34Copy(this, (MTX34*)p); }
157
158 MTX34(const MTX34& rhs) { (void)MTX34Copy(this, &rhs); }
159
160 MTX34& operator=(const MTX34& other) = default;
161
162 MTX34(f32 x00, f32 x01, f32 x02, f32 x03,
163 f32 x10, f32 x11, f32 x12, f32 x13,
164 f32 x20, f32 x21, f32 x22, f32 x23)
165 {
166 f._00 = x00; f._01 = x01; f._02 = x02; f._03 = x03;
167 f._10 = x10; f._11 = x11; f._12 = x12; f._13 = x13;
168 f._20 = x20; f._21 = x21; f._22 = x22; f._23 = x23;
169 }
170
171
172 operator f32*() { return this->a; }
173 operator const f32*() const { return this->a; }
174
175 f32* ToF32() { return this->a; }
176 const f32* ToF32() const { return this->a; }
177
178 template <typename FromPtr>
180 {
181 return reinterpret_cast<MTX34*>( fromPtr );
182 }
183
184 template <typename FromPtr>
185 static const MTX34* CastFrom(const FromPtr* fromPtr)
186 {
187 return reinterpret_cast<const MTX34*>( fromPtr );
188 }
189
190 template <typename FromPtr>
192 {
193 return *reinterpret_cast<MTX34*>( &fromPtr );
194 }
195
196 template <typename FromPtr>
197 static const MTX34& CastFrom(const FromPtr& fromPtr)
198 {
199 return *reinterpret_cast<const MTX34*>( &fromPtr );
200 }
201
203 {
204 return *reinterpret_cast<VEC4*>(&this->v[index]);
205 }
206
207 const VEC4& GetRow(int index) const
208 {
209 return *reinterpret_cast<const VEC4*>(&this->v[index]);
210 }
211
213 {
214 VEC3 column;
215 column.x = this->m[0][index];
216 column.y = this->m[1][index];
217 column.z = this->m[2][index];
218 return column;
219 }
220
221 void SetColumn(int index, const VEC3& column)
222 {
223 this->m[0][index] = column.x;
224 this->m[1][index] = column.y;
225 this->m[2][index] = column.z;
226 }
227
228 self_type& operator += (const self_type& rhs) { return *MTX34Add(this, this, &rhs); }
229 self_type& operator -= (const self_type& rhs) { return *MTX34Sub(this, this, &rhs); }
230
231 self_type& operator *= (f32 x) { return *MTX34Mult(this, this, x); }
232 self_type& operator /= (f32 x) { return operator*=(1.f / x); }
233
234 self_type operator + () const { return *this; }
236 {
237 return MTX34(-f._00, -f._01, -f._02, -f._03,
238 -f._10, -f._11, -f._12, -f._13,
239 -f._20, -f._21, -f._22, -f._23);
240 }
241
242 self_type operator + (const self_type& rhs) const { MTX34 tmp; return *MTX34Add(&tmp, this, &rhs); }
243 self_type operator - (const self_type& rhs) const { MTX34 tmp; return *MTX34Sub(&tmp, this, &rhs); }
244
245 self_type operator * (f32 x) const { MTX34 tmp; return *MTX34Mult(&tmp, this, x); }
246 self_type operator / (f32 x) const { return *this * (1.f / x); }
247
248 self_type& Transpose() { return *MTX34Transpose(this, this); }
249
251 {
252 MTX34Inverse(this, &mtx); return *this;
253 }
254
256 {
257 MTX34Inverse(this, this); return *this;
258 }
259
260 self_type& SetMult( const MTX34& lhs, const MTX34& rhs )
261 {
262 return *MTX34Mult( this, &lhs, &rhs );
263 }
264
265 self_type& SetIdentity() { return *MTX34Identity(this); }
266
267 self_type& SetScale(const VEC3& scale) { return *MTX34Scale(this, &scale); }
268
270 {
271 return *MTX34Translate(this, &translate);
272 }
273
275 {
276 return *MTX34RotXYZRad(this, rotate.x, rotate.y, rotate.z);
277 }
278
280 {
281 return *MTX34RotAxisRad(this, &axis, theta);
282 }
283
285 {
286 return *QUATToMTX34(this, &quaternion);
287 }
288
290 {
291 return *MTX34LookAt(this, &camPos, &camUp, &target);
292 }
293
295 {
296 return *MTX34LookAt(this, &camPos, twist, &target);
297 }
298
300 {
301 return *MTX34CameraRotate(this, &camPos, &camRotate);
302 }
303
308
313
318
319 self_type& SetSRTMtx(const VEC3& s, const VEC3& r, const VEC3& t)
320 {
321 return *MTX34MakeSRT(this, &s, &r, &t);
322 }
323
324 self_type& SetSTMtx(const VEC3& s, const VEC3& t)
325 {
326 return *MTX34MakeST(this, &s, &t);
327 }
328
330 {
331 return *MTX34MakeS(this, &s);
332 }
333
334 bool operator == (const self_type& rhs) const { return ::std::memcmp(this, &rhs, sizeof(MTX34)) == 0; }
335 bool operator != (const self_type& rhs) const { return ::std::memcmp(this, &rhs, sizeof(MTX34)) != 0; }
336
337 bool IsIdentity() const { return MTX34IsIdentity(this); }
338};
339
340typedef struct MTX34 Matrix34;
341
342inline MTX34 operator * (f32 f, const MTX34& rhs)
343{
344 MTX34 tmp;
345 (void)MTX34Mult(&tmp, &rhs, f);
346 return tmp;
347}
348
350MTX34Copy(MTX34* pOut, const MTX34* p)
351{
352 if ( p != pOut )
353 {
354 *pOut = *p;
355 }
356
357 return pOut;
358}
359
361MTX34Mult(MTX34* pOut, const MTX34* p1, const MTX34* p2)
362{
363 return NW_MATH_IMPL_NS::MTX34Mult(pOut, p1, p2);
364}
365
366} } // namespace nw::math
367
368namespace nw { namespace math {
369
370inline bool MTX34IsIdentity(const MTX34& m) { return MTX34IsIdentity( &m ); }
371
372inline MTX34* MTX34Add(MTX34* pOut, const MTX34& m1, const MTX34& m2) { return MTX34Add( pOut, &m1, &m2 ); }
373inline MTX34* MTX34Sub(MTX34* pOut, const MTX34& m1, const MTX34& m2) { return MTX34Sub( pOut, &m1, &m2 ); }
374inline MTX34* MTX34Mult(MTX34* pOut, const MTX34& m, f32 f) { return MTX34Mult( pOut, &m, f ); }
375inline MTX34* MTX34Mult(MTX34* pOut, const MTX34& m1, const MTX34& m2) { return MTX34Mult( pOut, &m1, &m2 ); }
376inline MTX34* MTX34MAdd(MTX34* pOut, f32 t, const MTX34& m1, const MTX34& m2) { return MTX34MAdd( pOut, t, &m1, &m2 ); }
377
378inline MTX34* MTX34Copy(MTX34* pOut, const MTX34& m) { return MTX34Copy( pOut, &m ); }
379inline MTX34* MTX34MultArray(MTX34* pOut, const MTX34& m1, const MTX34* pSrc, s32 count) { return MTX34MultArray( pOut, &m1, pSrc, count ); }
380inline u32 MTX34Inverse(MTX34* pOut, const MTX34& m) { return MTX34Inverse( pOut, &m ); }
381inline MTX34* MTX34Transpose(MTX34* pOut, const MTX34& m) { return MTX34Transpose( pOut, &m ); }
382inline u32 MTX34InvTranspose(MTX34* pOut, const MTX34& m) { return MTX34InvTranspose( pOut, &m ); }
383
384inline MTX34* MTX34LookAt(MTX34* pOut, const VEC3& vCamPos, const VEC3& vCamUp, const VEC3& vTarget) { return MTX34LookAt( pOut, &vCamPos, &vCamUp, &vTarget ); }
385inline MTX34* MTX34LookAt(MTX34* pOut, const VEC3& vCamPos, f32 twist, const VEC3& vTarget) { return MTX34LookAt( pOut, &vCamPos, twist, &vTarget ); }
386inline MTX34* MTX34CameraRotate(MTX34* pOut, const VEC3& vCamPos, const VEC3& vCamRotate) { return MTX34CameraRotate( pOut, &vCamPos, &vCamRotate ); }
387
388inline MTX34* MTX34RotXYZTranslateIdx(MTX34* pOut, u32 idxX, u32 idxY, u32 idxZ, const VEC3& vT) { return MTX34RotXYZTranslateIdx( pOut, idxX, idxY, idxZ, &vT ); }
389inline MTX34* MTX34RotAxisIdx(MTX34* pOut, const VEC3& vAxis, u32 idx) { return MTX34RotAxisIdx( pOut, &vAxis, idx ); }
390inline MTX34* MTX34RotAxisRad(MTX34* pOut, const VEC3& vAxis, f32 fRad) { return MTX34RotAxisRad( pOut, &vAxis, fRad ); }
391inline MTX34* MTX34RotAxisDeg(MTX34* pOut, const VEC3& vAxis, f32 fDeg) { return MTX34RotAxisDeg( pOut, &vAxis, fDeg ); }
392
393inline MTX34* MTX34Scale(MTX34* pOut, const VEC3& vS) { return MTX34Scale( pOut, &vS ); }
394inline MTX34* MTX34MultScale(MTX34* pOut, const MTX34& m, const VEC3& vS) { return MTX34MultScale( pOut, &m, &vS ); }
395inline MTX34* MTX34MultScale(MTX34* pOut, const VEC3& vS, const MTX34& m) { return MTX34MultScale( pOut, &vS, &m ); }
396
397inline MTX34* MTX34Translate(MTX34* pOut, const VEC3& vT) { return MTX34Translate( pOut, &vT ); }
398inline MTX34* MTX34MultTranslate(MTX34* pOut, const MTX34& m, const VEC3& vT) { return MTX34MultTranslate( pOut, &m, &vT ); }
399inline MTX34* MTX34MultTranslate(MTX34* pOut, const VEC3& vT, const MTX34& m) { return MTX34MultTranslate( pOut, &vT, &m ); }
400
401inline MTX34* MTX34MakeSRT(MTX34* pOut, const VEC3& s, const VEC3& r, const VEC3& t) { return MTX34MakeSRT( pOut, &s, &r, &t ); }
402inline MTX34* MTX34MakeST(MTX34* pOut, const VEC3& s, const VEC3& t) { return MTX34MakeST( pOut, &s, &t ); }
403inline MTX34* MTX34MakeS(MTX34* pOut, const VEC3& s) { return MTX34MakeS( pOut, &s ); }
404
405inline MTX34* QUATToMTX34(MTX34* pOut, const QUAT& q) { return QUATToMTX34( pOut, &q ); }
406
407} } // namespace nw::math
408
409#if defined(NW_MATH_AS_INLINE)
410
411#include <cmath>
412#include <nw/math/math_Vector3.h>
413
414namespace nw { namespace math {
415
416namespace internal { namespace standard {
417
419VEC3Transform(VEC3* pOut, const MTX34* __restrict pM, const VEC3* __restrict pV)
420{
421 const f32 x = pM->f._00 * pV->x + pM->f._01 * pV->y + pM->f._02 * pV->z + pM->f._03;
422 const f32 y = pM->f._10 * pV->x + pM->f._11 * pV->y + pM->f._12 * pV->z + pM->f._13;
423 const f32 z = pM->f._20 * pV->x + pM->f._21 * pV->y + pM->f._22 * pV->z + pM->f._23;
424
425 pOut->x = x;
426 pOut->y = y;
427 pOut->z = z;
428
429 return pOut;
430}
431
432
434MTX34Add(MTX34* pOut, const MTX34* p1, const MTX34* p2)
435{
436 pOut->f._00 = p1->f._00 + p2->f._00;
437 pOut->f._01 = p1->f._01 + p2->f._01;
438 pOut->f._02 = p1->f._02 + p2->f._02;
439 pOut->f._03 = p1->f._03 + p2->f._03;
440
441 pOut->f._10 = p1->f._10 + p2->f._10;
442 pOut->f._11 = p1->f._11 + p2->f._11;
443 pOut->f._12 = p1->f._12 + p2->f._12;
444 pOut->f._13 = p1->f._13 + p2->f._13;
445
446 pOut->f._20 = p1->f._20 + p2->f._20;
447 pOut->f._21 = p1->f._21 + p2->f._21;
448 pOut->f._22 = p1->f._22 + p2->f._22;
449 pOut->f._23 = p1->f._23 + p2->f._23;
450
451 return pOut;
452}
453
454
456MTX34Sub(MTX34* pOut, const MTX34* p1, const MTX34* p2)
457{
458 pOut->f._00 = p1->f._00 - p2->f._00;
459 pOut->f._01 = p1->f._01 - p2->f._01;
460 pOut->f._02 = p1->f._02 - p2->f._02;
461 pOut->f._03 = p1->f._03 - p2->f._03;
462
463 pOut->f._10 = p1->f._10 - p2->f._10;
464 pOut->f._11 = p1->f._11 - p2->f._11;
465 pOut->f._12 = p1->f._12 - p2->f._12;
466 pOut->f._13 = p1->f._13 - p2->f._13;
467
468 pOut->f._20 = p1->f._20 - p2->f._20;
469 pOut->f._21 = p1->f._21 - p2->f._21;
470 pOut->f._22 = p1->f._22 - p2->f._22;
471 pOut->f._23 = p1->f._23 - p2->f._23;
472
473 return pOut;
474}
475
476
478MTX34Mult(MTX34* pOut, const MTX34* p, f32 f)
479{
480 pOut->f._00 = p->f._00 * f;
481 pOut->f._01 = p->f._01 * f;
482 pOut->f._02 = p->f._02 * f;
483 pOut->f._03 = p->f._03 * f;
484
485 pOut->f._10 = p->f._10 * f;
486 pOut->f._11 = p->f._11 * f;
487 pOut->f._12 = p->f._12 * f;
488 pOut->f._13 = p->f._13 * f;
489
490 pOut->f._20 = p->f._20 * f;
491 pOut->f._21 = p->f._21 * f;
492 pOut->f._22 = p->f._22 * f;
493 pOut->f._23 = p->f._23 * f;
494
495 return pOut;
496}
497
498
500MTX34MultScale(MTX34* pOut, const MTX34* pM, const VEC3* pS)
501{
502 pOut->f._00 = pM->f._00 * pS->x;
503 pOut->f._10 = pM->f._10 * pS->x;
504 pOut->f._20 = pM->f._20 * pS->x;
505
506 pOut->f._01 = pM->f._01 * pS->y;
507 pOut->f._11 = pM->f._11 * pS->y;
508 pOut->f._21 = pM->f._21 * pS->y;
509
510 pOut->f._02 = pM->f._02 * pS->z;
511 pOut->f._12 = pM->f._12 * pS->z;
512 pOut->f._22 = pM->f._22 * pS->z;
513
514 if (pOut != pM)
515 {
516 pOut->f._03 = pM->f._03;
517 pOut->f._13 = pM->f._13;
518 pOut->f._23 = pM->f._23;
519 }
520
521 return pOut;
522}
523
524
526MTX34MultScale(MTX34* pOut, const VEC3* __restrict pS, const MTX34* pM)
527{
528 const f32 (*const src)[4] = pM->m;
529 f32 (*const dst)[4] = pOut->m;
530
531 dst[0][0] = src[0][0] * pS->x; dst[0][1] = src[0][1] * pS->x;
532 dst[0][2] = src[0][2] * pS->x; dst[0][3] = src[0][3] * pS->x;
533
534 dst[1][0] = src[1][0] * pS->y; dst[1][1] = src[1][1] * pS->y;
535 dst[1][2] = src[1][2] * pS->y; dst[1][3] = src[1][3] * pS->y;
536
537 dst[2][0] = src[2][0] * pS->z; dst[2][1] = src[2][1] * pS->z;
538 dst[2][2] = src[2][2] * pS->z; dst[2][3] = src[2][3] * pS->z;
539
540 return pOut;
541}
542
543
545MTX34MAdd(MTX34* pOut, f32 t, const MTX34* p1, const MTX34* p2)
546{
547 pOut->f._00 = t * p1->f._00 + p2->f._00;
548 pOut->f._01 = t * p1->f._01 + p2->f._01;
549 pOut->f._02 = t * p1->f._02 + p2->f._02;
550 pOut->f._03 = t * p1->f._03 + p2->f._03;
551
552 pOut->f._10 = t * p1->f._10 + p2->f._10;
553 pOut->f._11 = t * p1->f._11 + p2->f._11;
554 pOut->f._12 = t * p1->f._12 + p2->f._12;
555 pOut->f._13 = t * p1->f._13 + p2->f._13;
556
557 pOut->f._20 = t * p1->f._20 + p2->f._20;
558 pOut->f._21 = t * p1->f._21 + p2->f._21;
559 pOut->f._22 = t * p1->f._22 + p2->f._22;
560 pOut->f._23 = t * p1->f._23 + p2->f._23;
561
562 return pOut;
563}
564
566MTX34Mult(MTX34* pOut, const MTX34* p1, const MTX34* p2)
567{
568 MTX34 mTmp;
569
570 MTX34* __restrict pDst = (pOut == p1 || pOut == p2) ? &mTmp : pOut;
571
572 pDst->f._00 = p1->f._00 * p2->f._00 + p1->f._01 * p2->f._10 + p1->f._02 * p2->f._20;
573 pDst->f._01 = p1->f._00 * p2->f._01 + p1->f._01 * p2->f._11 + p1->f._02 * p2->f._21;
574 pDst->f._02 = p1->f._00 * p2->f._02 + p1->f._01 * p2->f._12 + p1->f._02 * p2->f._22;
575 pDst->f._03 = p1->f._00 * p2->f._03 + p1->f._01 * p2->f._13 + p1->f._02 * p2->f._23 + p1->f._03;
576
577 pDst->f._10 = p1->f._10 * p2->f._00 + p1->f._11 * p2->f._10 + p1->f._12 * p2->f._20;
578 pDst->f._11 = p1->f._10 * p2->f._01 + p1->f._11 * p2->f._11 + p1->f._12 * p2->f._21;
579 pDst->f._12 = p1->f._10 * p2->f._02 + p1->f._11 * p2->f._12 + p1->f._12 * p2->f._22;
580 pDst->f._13 = p1->f._10 * p2->f._03 + p1->f._11 * p2->f._13 + p1->f._12 * p2->f._23 + p1->f._13;
581
582 pDst->f._20 = p1->f._20 * p2->f._00 + p1->f._21 * p2->f._10 + p1->f._22 * p2->f._20;
583 pDst->f._21 = p1->f._20 * p2->f._01 + p1->f._21 * p2->f._11 + p1->f._22 * p2->f._21;
584 pDst->f._22 = p1->f._20 * p2->f._02 + p1->f._21 * p2->f._12 + p1->f._22 * p2->f._22;
585 pDst->f._23 = p1->f._20 * p2->f._03 + p1->f._21 * p2->f._13 + p1->f._22 * p2->f._23 + p1->f._23;
586
587 // overwrite a or b if needed
588 if ( pDst == &mTmp )
589 {
590 MTX34Copy( pOut, &mTmp );
591 }
592
593 return pOut;
594}
595
597MTX34Inverse(MTX34* pOut, const MTX34* p)
598{
599 MTX34 mTmp;
600 f32 (*m)[4];
601 f32 det;
602
603 f32 (*const inv)[4] = pOut->m;
604 const f32 (*const src)[4] = p->m;
605
606 if ( p == pOut )
607 {
608 m = mTmp.m;
609 }
610 else
611 {
612 m = inv;
613 }
614
615 // compute the determinant of the upper 3x3 submatrix
616 det = src[0][0]*src[1][1]*src[2][2]
617 + src[0][1]*src[1][2]*src[2][0]
618 + src[0][2]*src[1][0]*src[2][1]
619 - src[2][0]*src[1][1]*src[0][2]
620 - src[1][0]*src[0][1]*src[2][2]
621 - src[0][0]*src[2][1]*src[1][2];
622
623 // check if matrix is singular
624 if ( det == 0.0f )
625 {
626 return 0;
627 }
628
629 // compute the inverse of the upper submatrix:
630
631 // find the transposed matrix of cofactors of the upper submatrix
632 // and multiply by (1/det)
633
634 det = 1.0f / det;
635
636 m[0][0] = (src[1][1]*src[2][2] - src[2][1]*src[1][2]) * det;
637 m[0][1] = (src[2][1]*src[0][2] - src[0][1]*src[2][2]) * det;
638 m[0][2] = (src[0][1]*src[1][2] - src[1][1]*src[0][2]) * det;
639
640 m[1][0] = (src[2][0]*src[1][2] - src[1][0]*src[2][2]) * det;
641 m[1][1] = (src[0][0]*src[2][2] - src[2][0]*src[0][2]) * det;
642 m[1][2] = (src[1][0]*src[0][2] - src[0][0]*src[1][2]) * det;
643
644 m[2][0] = (src[1][0]*src[2][1] - src[2][0]*src[1][1]) * det;
645 m[2][1] = (src[2][0]*src[0][1] - src[0][0]*src[2][1]) * det;
646 m[2][2] = (src[0][0]*src[1][1] - src[1][0]*src[0][1]) * det;
647
648 // compute (invA)*(-C)
649 m[0][3] = -m[0][0]*src[0][3] - m[0][1]*src[1][3] - m[0][2]*src[2][3];
650 m[1][3] = -m[1][0]*src[0][3] - m[1][1]*src[1][3] - m[1][2]*src[2][3];
651 m[2][3] = -m[2][0]*src[0][3] - m[2][1]*src[1][3] - m[2][2]*src[2][3];
652
653 // copy back if needed
654 if ( m == mTmp.m )
655 {
656 MTX34Copy( pOut, &mTmp );
657 }
658
659 return 1;
660}
661
663MTX34InvTranspose(MTX34* pOut, const MTX34* __restrict p)
664{
665 MTX34 mTmp;
666 f32 (*m)[4];
667 f32 det;
668
669 f32 (*const invX)[4] = pOut->m;
670 const f32 (*const src)[4] = p->m;
671
672 if ( p == pOut )
673 {
674 m = mTmp.m;
675 }
676 else
677 {
678 m = invX;
679 }
680
681 // compute the determinant of the upper 3x3 submatrix
682 det = src[0][0]*src[1][1]*src[2][2]
683 + src[0][1]*src[1][2]*src[2][0]
684 + src[0][2]*src[1][0]*src[2][1]
685 - src[2][0]*src[1][1]*src[0][2]
686 - src[1][0]*src[0][1]*src[2][2]
687 - src[0][0]*src[2][1]*src[1][2];
688
689 // check if matrix is singular
690 if ( det == 0.0f )
691 {
692 return 0;
693 }
694
695 // compute the inverse-transpose of the upper submatrix:
696
697 // find the transposed matrix of cofactors of the upper submatrix
698 // and multiply by (1/det)
699
700 det = 1.0f / det;
701
702 m[0][0] = (src[1][1]*src[2][2] - src[2][1]*src[1][2]) * det;
703 m[0][1] = (src[1][2]*src[2][0] - src[2][2]*src[1][0]) * det;
704 m[0][2] = (src[1][0]*src[2][1] - src[2][0]*src[1][1]) * det;
705
706 m[1][0] = (src[2][1]*src[0][2] - src[0][1]*src[2][2]) * det;
707 m[1][1] = (src[2][2]*src[0][0] - src[0][2]*src[2][0]) * det;
708 m[1][2] = (src[2][0]*src[0][1] - src[0][0]*src[2][1]) * det;
709
710 m[2][0] = (src[0][1]*src[1][2] - src[1][1]*src[0][2]) * det;
711 m[2][1] = (src[0][2]*src[1][0] - src[1][2]*src[0][0]) * det;
712 m[2][2] = (src[0][0]*src[1][1] - src[1][0]*src[0][1]) * det;
713
714 // the fourth columns should be all zero
715 m[0][3] = 0.0F;
716 m[1][3] = 0.0F;
717 m[2][3] = 0.0F;
718
719 // copy back if needed
720 if ( m == mTmp.m )
721 {
722 MTX34Copy( pOut, &mTmp );
723 }
724
725 return 1;
726}
727
728} } // namespace internal::standard
729
730
731#if defined(NW_MATH_ENABLE_INTRINSICS)
732
733namespace internal { namespace intrinsics {
734
736VEC3Transform(VEC3* pOut, const MTX34* __restrict pM, const VEC3* __restrict pV)
737{
738 const f32x2 m00m01 = __PSQ_LX(pM, offsetof(MTX34, m[0][0]), 0, 0);
739 const f32x2 m02m03 = __PSQ_LX(pM, offsetof(MTX34, m[0][2]), 0, 0);
740 const f32x2 m10m11 = __PSQ_LX(pM, offsetof(MTX34, m[1][0]), 0, 0);
741 const f32x2 m12m13 = __PSQ_LX(pM, offsetof(MTX34, m[1][2]), 0, 0);
742 const f32x2 m20m21 = __PSQ_LX(pM, offsetof(MTX34, m[2][0]), 0, 0);
743 const f32x2 m22m23 = __PSQ_LX(pM, offsetof(MTX34, m[2][2]), 0, 0);
744
745 // { xy zw } = { x y z 1 }
746 const f32x2 xy = __PSQ_LX(pV, offsetof(VEC3, x), 0, 0);
747 const f32x2 zw = __PSQ_LX(pV, offsetof(VEC3, z), 1, 0);
748
749 f32x2 fp4, fp5, fp6;
750
751 // fp4 = [ m00 m01 m02, m03 ] . T[ x y z 1 ]
752 fp4 = __PS_MUL(m00m01, xy);
754 fp4 = __PS_SUM0(fp4, fp4, fp4);
755
756 // fp5 = [ m10 m11 m12, m13 ] . T[ x y z 1 ]
757 fp5 = __PS_MUL(m10m11, xy);
759 fp5 = __PS_SUM1(fp5, fp4, fp5);
760
761 // fp6 = [ m20 m21 m22, m23 ] . T[ x y z 1 ]
762 fp6 = __PS_MUL(m20m21, xy);
764 fp6 = __PS_SUM0(fp6, fp6, fp6);
765
766 tof32x2(pOut->x) = fp5;
767 pOut->z = fp6[0];
768
769 return pOut;
770}
771
772
774MTX34Add(MTX34* pOut, const MTX34* p1, const MTX34* p2)
775{
776 f32x2 fp0 = __PS_ADD(tof32x2(p1->a[0] ), tof32x2(p2->a[0] ));
777 f32x2 fp1 = __PS_ADD(tof32x2(p1->a[2] ), tof32x2(p2->a[2] ));
778 f32x2 fp2 = __PS_ADD(tof32x2(p1->a[4] ), tof32x2(p2->a[4] ));
779 f32x2 fp3 = __PS_ADD(tof32x2(p1->a[6] ), tof32x2(p2->a[6] ));
780 f32x2 fp4 = __PS_ADD(tof32x2(p1->a[8] ), tof32x2(p2->a[8] ));
781 f32x2 fp5 = __PS_ADD(tof32x2(p1->a[10]), tof32x2(p2->a[10]));
782
783 tof32x2(pOut->a[0] ) = fp0;
784 tof32x2(pOut->a[2] ) = fp1;
785 tof32x2(pOut->a[4] ) = fp2;
786 tof32x2(pOut->a[6] ) = fp3;
787 tof32x2(pOut->a[8] ) = fp4;
788 tof32x2(pOut->a[10]) = fp5;
789
790 return pOut;
791}
792
793
795MTX34Sub(MTX34* pOut, const MTX34* p1, const MTX34* p2)
796{
797 f32x2 fp0 = __PS_SUB(tof32x2(p1->a[0] ), tof32x2(p2->a[0] ));
798 f32x2 fp1 = __PS_SUB(tof32x2(p1->a[2] ), tof32x2(p2->a[2] ));
799 f32x2 fp2 = __PS_SUB(tof32x2(p1->a[4] ), tof32x2(p2->a[4] ));
800 f32x2 fp3 = __PS_SUB(tof32x2(p1->a[6] ), tof32x2(p2->a[6] ));
801 f32x2 fp4 = __PS_SUB(tof32x2(p1->a[8] ), tof32x2(p2->a[8] ));
802 f32x2 fp5 = __PS_SUB(tof32x2(p1->a[10]), tof32x2(p2->a[10]));
803
804 tof32x2(pOut->a[0] ) = fp0;
805 tof32x2(pOut->a[2] ) = fp1;
806 tof32x2(pOut->a[4] ) = fp2;
807 tof32x2(pOut->a[6] ) = fp3;
808 tof32x2(pOut->a[8] ) = fp4;
809 tof32x2(pOut->a[10]) = fp5;
810
811 return pOut;
812}
813
814
816MTX34Mult(MTX34* pOut, const MTX34* p, f32 f)
817{
818 f32x2 fp0 = __PS_MULS0F(tof32x2(p->a[0] ), f);
819 f32x2 fp1 = __PS_MULS0F(tof32x2(p->a[2] ), f);
820 f32x2 fp2 = __PS_MULS0F(tof32x2(p->a[4] ), f);
821 f32x2 fp3 = __PS_MULS0F(tof32x2(p->a[6] ), f);
822 f32x2 fp4 = __PS_MULS0F(tof32x2(p->a[8] ), f);
823 f32x2 fp5 = __PS_MULS0F(tof32x2(p->a[10]), f);
824
825 tof32x2(pOut->a[0] ) = fp0;
826 tof32x2(pOut->a[2] ) = fp1;
827 tof32x2(pOut->a[4] ) = fp2;
828 tof32x2(pOut->a[6] ) = fp3;
829 tof32x2(pOut->a[8] ) = fp4;
830 tof32x2(pOut->a[10]) = fp5;
831
832 return pOut;
833}
834
835
837MTX34MultScale(MTX34* pOut, const MTX34* pM, const VEC3* pS)
838{
839 // d = { m00 m01 m02 m03 } . { sx 0 0 0 }
840 // { m10 m11 m12 m13 } { 0 sy 0 0 }
841 // { m20 m21 m22 m23 } { 0 0 sz 0 }
842 // { 0 0 0 1 } { 0 0 0 1 }
843 //
844 // = { sx*m00 sy*m01 sz*m02 m03 }
845 // { sx*m10 sy*m11 sz*m12 m13 }
846 // { sx*m20 sy*m21 sz*m22 m23 }
847 // { 0 0 0 1 }
848
849 // { xy zw } = { sx sy sz 1 }
850 const f32x2 xy = __PSQ_LX(pS, offsetof(VEC3, x), 0, 0);
851 const f32x2 zw = __PSQ_LX(pS, offsetof(VEC3, z), 1, 0);
852
856
860
861 tof32x2(pOut->f._00) = fp00;
862 tof32x2(pOut->f._10) = fp10;
863 tof32x2(pOut->f._20) = fp20;
864
865 tof32x2(pOut->f._02) = fp02;
866 tof32x2(pOut->f._12) = fp12;
867 tof32x2(pOut->f._22) = fp22;
868
869 return pOut;
870}
871
872
874MTX34MultScale(MTX34* pOut, const VEC3* __restrict pS, const MTX34* pM)
875{
876 // d = { sx 0 0 0 } . { m00 m01 m02 m03 }
877 // { 0 sy 0 0 } { m10 m11 m12 m13 }
878 // { 0 0 sz 0 } { m20 m21 m22 m23 }
879 // { 0 0 0 1 } { 0 0 0 1 }
880 //
881 // = { sx*m00 sx*m01 sx*m02 sx*m03 }
882 // { sy*m10 sy*m11 sy*m12 sy*m13 }
883 // { sz*m20 sz*m21 sz*m22 sz*m23 }
884 // { 0 0 0 1 }
885
886 // { xy zw } = { sx sy sz 1 }
887 const f32x2 xy = __PSQ_LX(pS, offsetof(VEC3, x), 0, 0);
888 const f32x2 zw = __PSQ_LX(pS, offsetof(VEC3, z), 1, 0);
889
892
895
898
899 tof32x2(pOut->f._00) = fp00;
900 tof32x2(pOut->f._02) = fp02;
901
902 tof32x2(pOut->f._10) = fp10;
903 tof32x2(pOut->f._12) = fp12;
904
905 tof32x2(pOut->f._20) = fp20;
906 tof32x2(pOut->f._22) = fp22;
907
908 return pOut;
909}
910
911
913MTX34MAdd(MTX34* pOut, f32 t, const MTX34* p1, const MTX34* p2)
914{
915 f32x2 fp0 = __PS_MADDS0F(tof32x2(p1->a[0] ), t, tof32x2(p2->a[0] ));
916 f32x2 fp1 = __PS_MADDS0F(tof32x2(p1->a[2] ), t, tof32x2(p2->a[2] ));
917 f32x2 fp2 = __PS_MADDS0F(tof32x2(p1->a[4] ), t, tof32x2(p2->a[4] ));
918 f32x2 fp3 = __PS_MADDS0F(tof32x2(p1->a[6] ), t, tof32x2(p2->a[6] ));
919 f32x2 fp4 = __PS_MADDS0F(tof32x2(p1->a[8] ), t, tof32x2(p2->a[8] ));
920 f32x2 fp5 = __PS_MADDS0F(tof32x2(p1->a[10]), t, tof32x2(p2->a[10]));
921
922 tof32x2(pOut->a[0] ) = fp0;
923 tof32x2(pOut->a[2] ) = fp1;
924 tof32x2(pOut->a[4] ) = fp2;
925 tof32x2(pOut->a[6] ) = fp3;
926 tof32x2(pOut->a[8] ) = fp4;
927 tof32x2(pOut->a[10]) = fp5;
928
929 return pOut;
930}
931
933MTX34Mult(MTX34* d, const MTX34* a, const MTX34* b)
934{
935 const int ROW = 16;
936
937 // { f0 f4 } = { b00 b01 b02 b03 }
938 // { f1 f5 } { b10 b11 b12 b13 }
939 // { f2 f6 } { b20 b21 b22 b23 }
940 // { f7 } { 0 0 0 1 }
941
942 f32x2 f0 = __PSQ_LX(b, 0, 0, 0);
943 f32x2 f1 = __PSQ_LX(b, 16, 0, 0);
944 f32x2 f2 = __PSQ_LX(b, 32, 0, 0);
945 f32x2 f4 = __PSQ_LX(b, 8, 0, 0);
946 f32x2 f5 = __PSQ_LX(b, 24, 0, 0);
947 f32x2 f6 = __PSQ_LX(b, 40, 0, 0);
948 f32x2 f7 = { 0, 1 };
949
950 f32x2 f8, f9, f10;
951
952 // { d00 d01 d02 d03 } = { f9 f10 } := { a00 a01 a02 a03 } . { f0 f4 }
953 // { f1 f5 }
954 // { f2 f6 }
955 // { f7 }
956
957 f8 = __PSQ_LX(a, 0 * ROW + 0, 0, 0); // { a00 a01 }
958 f9 = __PS_MULS0(f0, f8);
959 f10 = __PS_MULS0(f4, f8);
960 f9 = __PS_MADDS1(f1, f8, f9);
961 f10 = __PS_MADDS1(f5, f8, f10);
962 f8 = __PSQ_LX(a, 0 * ROW + 8, 0, 0); // { a02 a03 }
963 f9 = __PS_MADDS0(f2, f8, f9);
964 f10 = __PS_MADDS0(f6, f8, f10);
965 f10 = __PS_MADDS1(f7, f8, f10);
966 __PSQ_STX(d, 0 * ROW + 0, f9, 0, 0);
967 __PSQ_STX(d, 0 * ROW + 8, f10, 0, 0);
968
969 // { f0 f4 }
970 // { d10 d11 d12 d13 } = { f9 f10 } := { a10 a11 a12 a13 } . { f1 f5 }
971 // { f2 f6 }
972 // { f7 }
973
974 f8 = __PSQ_LX(a, 1 * ROW + 0, 0, 0); // { a10 a11 }
975 f9 = __PS_MULS0(f0, f8);
976 f10 = __PS_MULS0(f4, f8);
977 f9 = __PS_MADDS1(f1, f8, f9);
978 f10 = __PS_MADDS1(f5, f8, f10);
979 f8 = __PSQ_LX(a, 1 * ROW + 8, 0, 0); // { a12 a13 }
980 f9 = __PS_MADDS0(f2, f8, f9);
981 f10 = __PS_MADDS0(f6, f8, f10);
982 f10 = __PS_MADDS1(f7, f8, f10);
983 __PSQ_STX(d, 1 * ROW + 0, f9, 0, 0);
984 __PSQ_STX(d, 1 * ROW + 8, f10, 0, 0);
985
986 // { f0 f4 }
987 // { f1 f5 }
988 // { d20 d21 d22 d23 } = { f9 f10 } := { a20 a21 a22 a23 } . { f2 f6 }
989 // { f7 }
990
991 f8 = __PSQ_LX(a, 2 * ROW + 0, 0, 0); // { a20 a21 }
992 f9 = __PS_MULS0(f0, f8);
993 f10 = __PS_MULS0(f4, f8);
994 f9 = __PS_MADDS1(f1, f8, f9);
995 f10 = __PS_MADDS1(f5, f8, f10);
996 f8 = __PSQ_LX(a, 2 * ROW + 8, 0, 0); // { a22 a23 }
997 f9 = __PS_MADDS0(f2, f8, f9);
998 f10 = __PS_MADDS0(f6, f8, f10);
999 f10 = __PS_MADDS1(f7, f8, f10);
1000 __PSQ_STX(d, 2 * ROW + 0, f9, 0, 0);
1001 __PSQ_STX(d, 2 * ROW + 8, f10, 0, 0);
1002
1003 return d;
1004}
1005
1007MTX34Inverse(MTX34* pOut, const MTX34* p)
1008{
1009 f32 (*const inv)[4] = pOut->m;
1010 const f32 (*const src)[4] = p->m;
1011
1012 f32x2 fp0;
1013 f32x2 fp1;
1014 f32x2 fp2;
1015 f32x2 fp3;
1016 f32x2 fp4;
1017 f32x2 fp5;
1018
1019 f32x2 fp6;
1020 f32x2 fp7;
1021 f32x2 fp8;
1022 f32x2 fp9;
1023 f32x2 fp10;
1024 f32x2 fp11;
1025 f32x2 fp12;
1026 f32x2 fp13;
1027
1028 // det = 00 * 11 * 22 + 01 * 12 * 20 + 02 * 10 * 21
1029 // - 20 * 11 * 02 - 10 * 01 * 22 - 00 * 21 * 12;
1030
1031 // fp0 [ 00 ][ 1.0F ] : Load
1032 fp0 = __PSQ_LX(src, 0, 1, 0);
1033
1034 // fp1 [ 01 ][ 02 ] : Load
1035 fp1 = __PSQ_LX(src, 4, 0, 0);
1036
1037 // fp2 [ 10 ][ 1.0F ] : Load
1038 fp2 = __PSQ_LX(src, 16, 1, 0);
1039
1040 // fp6 [ 02 ][ 00 ]
1041 fp6 = __PS_MERGE10(fp1, fp0);
1042
1043 // fp3 [ 11 ][ 12 ] : Load
1044 fp3 = __PSQ_LX(src, 20, 0, 0);
1045
1046 // fp4 [ 20 ][ 1.0F ] : Load
1047 fp4 = __PSQ_LX(src, 32, 1, 0);
1048
1049 // fp7 [ 12 ][ 10 ]
1050 fp7 = __PS_MERGE10(fp3, fp2);
1051
1052 // fp5 [ 21 ][ 22 ] : Load
1053 fp5 = __PSQ_LX(src, 36, 0, 0);
1054
1055 // fp11[ 11*02 ][ 00*12 ]
1056 fp11 = __PS_MUL(fp3, fp6);
1057
1058 // fp8 [ 22 ][ 20 ]
1059 fp8 = __PS_MERGE10(fp5, fp4);
1060
1061 // fp13[ 21*12 ][ 10*22 ]
1062 fp13 = __PS_MUL(fp5, fp7);
1063
1064 // fp11[ 01*12 - 11*02 ][ 10*02 - 00*12 ]
1065 fp11 = __PS_MSUB(fp1, fp7, fp11);
1066
1067 // fp12[ 01*22 ][ 20*02 ]
1068 fp12 = __PS_MUL(fp1, fp8);
1069
1070 // fp13[ 11*22 - 21*12 ][ 20*12 - 10*22 ]
1071 fp13 = __PS_MSUB(fp3, fp8, fp13);
1072
1073 // fp10[ 20*11 ][ N/A ]
1074 fp10 = __PS_MUL(fp3, fp4);
1075
1076 // fp12[ 21*02 - 01*22 ][ 00*22 - 20*02 ]
1077 fp12 = __PS_MSUB(fp5, fp6, fp12);
1078
1079 // fp7 [ 00*(11*22-21*12) ][ N/A ]
1080 fp7 = __PS_MUL(fp0, fp13);
1081
1082 // fp9 [ 00*21 ][ N/A ]
1083 fp9 = __PS_MUL(fp0, fp5);
1084
1085 // fp8 [ 10*01 ][ N/A ]
1086 fp8 = __PS_MUL(fp1, fp2);
1087
1088 // fp7 [ 00*(11*22-21*12) + 10*(21*02-01*22) ][ N/A ]
1089 fp7 = __PS_MADD(fp2, fp12, fp7);
1090
1091 // fp6 [ 0.0F ][ 0.0F ]
1092 fp6 = __PS_SUB(fp6, fp6);
1093
1094 // fp10[ 10*21 - 20*11 ][ N/A ]
1095 fp10 = __PS_MSUB(fp2, fp5, fp10);
1096
1097 // fp7 [ 00*(11*22-21*12) + 10*(21*02-01*22) + 20*(01*12-11*02) ][ N/A ] : det
1098 fp7 = __PS_MADD(fp4, fp11, fp7);
1099
1100 // fp9 [ 20*01 - 00*21 ][ N/A ]
1101 fp9 = __PS_MSUB(fp1, fp4, fp9);
1102
1103 // fp8 [ 00*11 - 10*01 ][ N/A ]
1104 fp8 = __PS_MSUB(fp0, fp3, fp8);
1105
1106 // check if matrix is singular
1107 if( fp7[0] == 0.0f && fp7[1] == 0.0f)
1108 {
1109 return 0;
1110 }
1111
1112 // compute the inverse of the upper submatrix:
1113
1114 // find the transposed matrix of cofactors of the upper submatrix
1115 // and multiply by (1/det)
1116
1117 // fp0 [ 1/det ][ N/A ]
1118 fp0 = __PS_DIVS(1.f, fp7[0]);
1119
1120 // fp1 [ 03 ][ 03 ] : Load
1121 fp1[0] = src[0][3];
1122 fp1[1] = src[0][3];
1123
1124 // fp13[ ( 11*22 - 21*12 ) * rdet ][ ( 20*12 - 10*22 ) * rdet ] : i[0][0], i[1][0]
1125 fp13 = __PS_MULS0(fp13, fp0);
1126
1127 // fp2 [ 13 ][ 13 ] : Load
1128 fp2[0] = src[1][3];
1129 fp2[1] = src[1][3];
1130
1131 // fp12[ ( 21*02 - 01*22 ) * rdet ][ ( 00*22 - 20*02 ) * rdet ] : i[0][1], i[1][1]
1132 fp12 = __PS_MULS0(fp12, fp0);
1133
1134 // fp3 [ 23 ][ 23 ] : Load
1135 fp3[0] = src[2][3];
1136 fp3[1] = src[2][3];
1137
1138 // fp11[ ( 01*12 - 11*02 ) * rdet ][ ( 10*02 - 00*12 ) * rdet ] : i[0][2], i[1][2]
1139 fp11 = __PS_MULS0(fp11, fp0);
1140
1141 // fp5 [ i00 ][ i01 ]
1143
1144 // fp4 [ i10 ][ i11 ]
1146
1147 // fp6 [ i00*03 ][ i10*03 ]
1148 fp6 = __PS_MUL(fp13, fp1);
1149
1150 // [ i00 ][ i01 ] : Store fp5 -> free(fp5[ i00 ][ i01 ])
1151 //inv[0][0] = fp5[0];
1152 //inv[0][1] = fp5[1];
1153 __PSQ_STX(inv, 0, fp5, 0, 0);
1154
1155 // [ i10 ][ i11 ] : Store fp4 -> free(fp4[ i10 ][ i11 ])
1156 //inv[1][0] = fp4[0];
1157 //inv[1][1] = fp4[1];
1158 __PSQ_STX(inv, 16, fp4, 0, 0);
1159
1160 // fp10[ ( 10*21 - 20*11 ) * rdet ] : i[2][0]
1161 fp10 = __PS_MULS0(fp10, fp0);
1162
1163 // fp9 [ ( 20*01 - 00*21 ) * rdet ] : i[2][1]
1164 fp9 = __PS_MULS0(fp9, fp0);
1165
1166 // fp6 [ i00*03+i01*13 ][ i10*03+i11*13 ]
1167 fp6 = __PS_MADD(fp12, fp2, fp6);
1168
1169 // [ i20 ] : Store fp10
1170 //inv[2][0] = fp10[0];
1171 __PSQ_STX(inv, 32, fp10, 1, 0);
1172
1173 // fp8 [ ( 00*11 - 10*01 ) * rdet ] : i[2][2]
1174 fp8 = __PS_MULS0(fp8, fp0);
1175
1176 // fp6 [ -i00*03-i01*13-i02*23 ][ -i10*03-i11*13-i12*23 ] : i[0][3], i[1][3]
1177 fp6 = __PS_NMADD(fp11, fp3, fp6);
1178
1179 // [ i21 ] : Store fp9
1180 //inv[2][1] = fp9[0];
1181 __PSQ_STX(inv, 36, fp9, 1, 0);
1182
1183 // fp7 [ i20*03 ][ N/A ]
1184 fp7 = __PS_MUL(fp10, fp1);
1185
1186 // fp5 [ i02 ][ i03 ]
1188
1189 // [ i22 ] : Store fp8
1190 //inv[2][2] = fp8[0];
1191 __PSQ_STX(inv, 40, fp8, 1, 0);
1192
1193 // fp7 [ i20*03+i21*13 ][ N/A ]
1194 fp7 = __PS_MADD(fp9, fp2, fp7);
1195
1196 // fp4 [ i12 ][ i13 ]
1198
1199 // [ i02 ][ i03 ] : Store fp5
1200 //inv[0][2] = fp5[0];
1201 //inv[0][3] = fp5[1];
1202 __PSQ_STX(inv, 8, fp5, 0, 0);
1203
1204 // fp7 [ -i20*03-i21*13-i22*23 ][ N/A ] : i[2][3]
1205 fp7 = __PS_NMADD(fp8, fp3, fp7);
1206
1207 // [ i12 ][ i13 ] : Store fp4
1208 //inv[1][2] = fp4[0];
1209 //inv[1][3] = fp4[1];
1210 __PSQ_STX(inv, 24, fp4, 0, 0);
1211
1212 // [ i23 ] : Store fp7
1213 //inv[2][3] = fp7[0];
1214 __PSQ_STX(inv, 44, fp7, 1, 0);
1215
1216 return 1;
1217}
1218
1220MTX34InvTranspose(MTX34* pOut, const MTX34* __restrict p)
1221{
1222 f32 (*const invX)[4] = pOut->m;
1223 const f32 (*const src)[4] = p->m;
1224
1225 f32x2 fp0;
1226 f32x2 fp1;
1227 f32x2 fp2;
1228 f32x2 fp3;
1229 f32x2 fp4;
1230 f32x2 fp5;
1231
1232 f32x2 fp6;
1233 f32x2 fp7;
1234 f32x2 fp8;
1235 f32x2 fp9;
1236 f32x2 fp10;
1237 f32x2 fp11;
1238 f32x2 fp12;
1239 f32x2 fp13;
1240
1241 // fp0 [ 00 ][ 1.0F ] : Load
1242 //fp0[0] = src[0][0];
1243 //fp0[1] = 1.0F;
1244 fp0 = __PSQ_LX(src, 0, 1, 0);
1245
1246 // fp1 [ 01 ][ 02 ] : Load
1247 //fp1[0] = src[0][1];
1248 //fp1[1] = src[0][2];
1249 fp1 = __PSQ_LX(src, 4, 0, 0);
1250
1251 // fp2 [ 10 ][ 1.0F ] : Load
1252 //fp2[0] = src[1][0];
1253 //fp2[1] = 1.0F;
1254 fp2 = __PSQ_LX(src, 16, 1, 0);
1255
1256 // fp6 [ 02 ][ 00 ]
1257 fp6 = __PS_MERGE10(fp1, fp0);
1258
1259 // fp3 [ 11 ][ 12 ] : Load
1260 //fp3[0] = src[1][1];
1261 //fp3[1] = src[1][2];
1262 fp3 = __PSQ_LX(src, 20, 0, 0);
1263
1264 // fp4 [ 20 ][ 1.0F ] : Load
1265 //fp4[0] = src[2][0];
1266 //fp4[1] = 1.0F;
1267 fp4 = __PSQ_LX(src, 32, 1, 0);
1268
1269 // fp7 [ 12 ][ 10 ]
1270 fp7 = __PS_MERGE10(fp3, fp2);
1271
1272 // fp5 [ 21 ][ 22 ] : Load
1273 //fp5[0] = src[2][1];
1274 //fp5[1] = src[2][2];
1275 fp5 = __PSQ_LX(src, 36, 0, 0);
1276
1277 // fp11[ 11*02 ][ 00*12 ]
1278 fp11 = __PS_MUL(fp3, fp6);
1279
1280 // fp8 [ 22 ][ 20 ]
1281 fp8 = __PS_MERGE10(fp5, fp4);
1282
1283 // fp13[ 21*12 ][ 10*22 ]
1284 fp13 = __PS_MUL(fp5, fp7);
1285
1286 // fp11[ 01*12 - 11*02 ][ 10*02 - 00*12 ]
1287 fp11 = __PS_MSUB(fp1, fp7, fp11);
1288
1289 // fp12[ 01*22 ][ 20*02 ]
1290 fp12 = __PS_MUL(fp1, fp8);
1291
1292 // fp13[ 11*22 - 21*12 ][ 20*12 - 10*22 ]
1293 fp13 = __PS_MSUB(fp3, fp8, fp13);
1294
1295 // fp10[ 20*11 ][ N/A ]
1296 fp10 = __PS_MUL(fp3, fp4);
1297
1298 // fp12[ 21*02 - 01*22 ][ 00*22 - 20*02 ]
1299 fp12 = __PS_MSUB(fp5, fp6, fp12);
1300
1301 // fp7 [ 00*(11*22-21*12) ][ N/A ]
1302 fp7 = __PS_MUL(fp0, fp13);
1303
1304 // fp9 [ 00*21 ][ N/A ]
1305 fp9 = __PS_MUL(fp0, fp5);
1306
1307 // fp8 [ 10*01 ][ N/A ]
1308 fp8 = __PS_MUL(fp1, fp2);
1309
1310 // fp7 [ 00*(11*22-21*12) + 10*(21*02-01*22) ][ N/A ]
1311 fp7 = __PS_MADD(fp2, fp12, fp7);
1312
1313 // fp6 [ 0.0F ][ 0.0F ]
1314 fp6 = __PS_SUB(fp6, fp6);
1315
1316 // fp10[ 10*21 - 20*11 ][ N/A ]
1317 fp10 = __PS_MSUB(fp2, fp5, fp10);
1318
1319 // fp7 [ 00*(11*22-21*12) + 10*(21*02-01*22) + 20*(01*12-11*02) ][ N/A ] : det
1320 fp7 = __PS_MADD(fp4, fp11, fp7);
1321
1322 // fp9 [ 20*01 - 00*21 ][ N/A ]
1323 fp9 = __PS_MSUB(fp1, fp4, fp9);
1324
1325 // fp8 [ 00*11 - 10*01 ][ N/A ]
1326 fp8 = __PS_MSUB(fp0, fp3, fp8);
1327
1328 // check if matrix is singular
1329 if( fp7[0] == 0.0f && fp7[1] == 0.0f)
1330 {
1331 return 0;
1332 }
1333
1334 // compute the inverse-transpose of the upper submatrix:
1335
1336 // find the transposed matrix of cofactors of the upper submatrix
1337 // and multiply by (1/det)
1338
1339 // fp0 [ 1/det ][ N/A ]
1340 fp0 = __PS_DIVS(1.f, fp7[0]);
1341
1342 // [ ix03 ] : Store fp6
1343 invX[0][3] = fp6[0];
1344
1345 // [ ix13 ] : Store fp6
1346 //invX[1][3] = fp6[0];
1347 __PSQ_STX(invX, 28, fp6, 1, 0);
1348
1349 // [ ix23 ] : Store fp6
1350 //invX[2][3] = fp6[0];
1351 __PSQ_STX(invX, 44, fp6, 1, 0);
1352
1353 // fp13[ ( 11*22 - 21*12 ) * rdet ][ ( 20*12 - 10*22 ) * rdet ] : ix[0][0], ix[0][1]
1354 fp13 = __PS_MULS0(fp13, fp0);
1355
1356 // fp12[ ( 21*02 - 01*22 ) * rdet ][ ( 00*22 - 20*02 ) * rdet ] : ix[1][0], ix[1][1]
1357 fp12 = __PS_MULS0(fp12, fp0);
1358
1359 // [ ix00 ][ ix01 ] : Store fp13
1360 //invX[0][0] = fp13[0];
1361 //invX[0][1] = fp13[1];
1362 __PSQ_STX(invX, 0, fp13, 0, 0);
1363
1364 // fp11[ ( 01*12 - 11*02 ) * rdet ][ ( 10*02 - 00*12 ) * rdet ] : ix[2][0], ix[2][1]
1365 fp11 = __PS_MULS0(fp11, fp0);
1366
1367 // [ ix10 ][ ix11 ] : Store fp12
1368 //invX[1][0] = fp12[0];
1369 //invX[1][1] = fp12[1];
1370 __PSQ_STX(invX, 16, fp12, 0, 0);
1371
1372 // fp10[ ( 10*21 - 20*11 ) * rdet ] : i[0][2]
1373 fp10 = __PS_MULS0(fp10, fp0);
1374
1375 // [ ix20 ][ ix21 ] : Store fp11
1376 //invX[2][0] = fp11[0];
1377 //invX[2][1] = fp11[1];
1378 __PSQ_STX(invX, 32, fp11, 0, 0);
1379
1380 // fp9 [ ( 20*01 - 00*21 ) * rdet ] : i[1][2]
1381 fp9 = __PS_MULS0(fp9, fp0);
1382
1383 // [ ix02 ] : Store fp10
1384 //invX[0][2] = fp10[0];
1385 __PSQ_STX(invX, 8, fp10, 1, 0);
1386
1387 // fp8 [ ( 00*11 - 10*01 ) * rdet ] : i[2][2]
1388 fp8 = __PS_MULS0(fp8, fp0);
1389
1390 // [ ix12 ] : Store fp9
1391 //invX[1][2] = fp9[0];
1392 __PSQ_STX(invX, 24, fp9, 1, 0);
1393
1394 // [ ix22 ] : Store fp8
1395 //invX[2][2] = fp8[0];
1396 __PSQ_STX(invX, 40, fp8, 1, 0);
1397
1398 return 1;
1399}
1400
1401} } // namespace internal::intrinsics
1402
1403#endif // NW_MATH_ENABLE_INTRINSICS
1404
1406VEC3Transform(VEC3* pOut, const MTX34* __restrict pM, const VEC3* __restrict pV)
1407{
1408 return NW_MATH_IMPL_NS::VEC3Transform(pOut, pM, pV);
1409}
1410
1411// NW_MATH_INLINE VEC3*
1412// VEC3CalcRPY(VEC3* pOut, const MTX34* pM)
1413// {
1414// f32 tmp = math::FAbs(pM->_20);
1415//
1416// if (1.0f - tmp < math::F_ULP)
1417// {
1418// pOut->x = 0.f;
1419// pOut->y = -math::F_PI / 2.0f * (pM->_20 / tmp);
1420// pOut->z = math::Atan2Rad(-pM->_01, -pM->_20 * pM->_02);
1421// }
1422// else
1423// {
1424// pOut->x = math::Atan2Rad(pM->_21, pM->_22);
1425// pOut->y = math::AsinRad(-pM->_20);
1426// pOut->z = math::Atan2Rad(pM->_10, pM->_00);
1427// }
1428//
1429// return pOut;
1430// }
1431
1433MTX34Zero(MTX34* pOut)
1434{
1435 pOut->f._00 = pOut->f._01 = pOut->f._02 = pOut->f._03 =
1436 pOut->f._10 = pOut->f._11 = pOut->f._12 = pOut->f._13 =
1437 pOut->f._20 = pOut->f._21 = pOut->f._22 = pOut->f._23 = 0.f;
1438
1439 return pOut;
1440}
1441
1443MTX34Identity(MTX34* pOut)
1444{
1446
1447 return pOut;
1448}
1449
1450NW_MATH_INLINE bool
1451MTX34IsIdentity(const MTX34* p)
1452{
1453 return p->f._00 == 1.f && p->f._01 == 0.f && p->f._02 == 0.f && p->f._03 == 0.f &&
1454 p->f._10 == 0.f && p->f._11 == 1.f && p->f._12 == 0.f && p->f._13 == 0.f &&
1455 p->f._20 == 0.f && p->f._21 == 0.f && p->f._22 == 1.f && p->f._23 == 0.f;
1456}
1457
1459MTX34Add(MTX34* pOut, const MTX34* p1, const MTX34* p2)
1460{
1461 return NW_MATH_IMPL_NS::MTX34Add(pOut, p1, p2);
1462}
1463
1465MTX34Sub(MTX34* pOut, const MTX34* p1, const MTX34* p2)
1466{
1467 return NW_MATH_IMPL_NS::MTX34Sub(pOut, p1, p2);
1468}
1469
1471MTX34Mult(MTX34* pOut, const MTX34* p, f32 f)
1472{
1473 return NW_MATH_IMPL_NS::MTX34Mult(pOut, p, f);
1474}
1475
1477MTX34Scale(MTX34* pOut, const VEC3* pS)
1478{
1479 f32 (*const m)[4] = pOut->m;
1480
1481 m[0][0] = pS->x; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f;
1482 m[1][0] = 0.0f; m[1][1] = pS->y; m[1][2] = 0.0f; m[1][3] = 0.0f;
1483 m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = pS->z; m[2][3] = 0.0f;
1484
1485 return pOut;
1486}
1487
1489MTX34MultScale(MTX34* pOut, const MTX34* pM, const VEC3* pS)
1490{
1491 return NW_MATH_IMPL_NS::MTX34MultScale(pOut, pM, pS);
1492}
1493
1495MTX34MultScale(MTX34* pOut, const VEC3* __restrict pS, const MTX34* pM)
1496{
1497 return NW_MATH_IMPL_NS::MTX34MultScale(pOut, pS, pM);
1498}
1499
1501MTX34Translate(MTX34* pOut, const VEC3* pT)
1502{
1503 f32 (*const m)[4] = pOut->m;
1504
1505 m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = pT->x;
1506 m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = pT->y;
1507 m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = pT->z;
1508
1509 return pOut;
1510}
1511
1513MTX34MultTranslate(MTX34* pOut, const VEC3* pT, const MTX34* pM)
1514{
1515 const f32 (*const src)[4] = pM->m;
1516 f32 (*const dst)[4] = pOut->m;
1517
1518 if ( src != dst )
1519 {
1520 dst[0][0] = src[0][0]; dst[0][1] = src[0][1]; dst[0][2] = src[0][2];
1521 dst[1][0] = src[1][0]; dst[1][1] = src[1][1]; dst[1][2] = src[1][2];
1522 dst[2][0] = src[2][0]; dst[2][1] = src[2][1]; dst[2][2] = src[2][2];
1523 }
1524
1525 dst[0][3] = src[0][3] + pT->x;
1526 dst[1][3] = src[1][3] + pT->y;
1527 dst[2][3] = src[2][3] + pT->z;
1528
1529 return pOut;
1530}
1531
1533MTX34MultTranslate(MTX34* pOut, const MTX34* pM, const VEC3* pT)
1534{
1535 // pOut = pM * pT
1536 if (pOut != pM)
1537 {
1538 (void)MTX34Copy(pOut, pM);
1539 }
1540
1541 VEC3 tmp;
1542 VEC3Transform(&tmp, pM, pT);
1543
1544 pOut->f._03 = tmp.x;
1545 pOut->f._13 = tmp.y;
1546 pOut->f._23 = tmp.z;
1547
1548 return pOut;
1549}
1550
1552MTX34MAdd(MTX34* pOut, f32 t, const MTX34* p1, const MTX34* p2)
1553{
1554 return NW_MATH_IMPL_NS::MTX34MAdd(pOut, t, p1, p2);
1555}
1556
1557static NW_MATH_INLINE MTX34*
1558MTX34RotAxisRad_( MTX34* pOut, const VEC3 *pAxis, f32 fRad )
1559{
1560 VEC3 vN;
1561 f32 s, c; // sinTheta, cosTheta
1562 f32 t; // ( 1 - cosTheta )
1563 f32 x, y, z; // x, y, z components of normalized axis
1564 f32 xSq, ySq, zSq; // x, y, z squared
1565
1566
1567 f32 (*const m)[4] = pOut->m;
1568
1569 s = ::std::sin(fRad);
1570 c = ::std::cos(fRad);
1571 t = 1.0f - c;
1572
1573 VEC3Normalize( &vN, pAxis );
1574
1575 x = vN.x;
1576 y = vN.y;
1577 z = vN.z;
1578
1579 xSq = x * x;
1580 ySq = y * y;
1581 zSq = z * z;
1582
1583 m[0][0] = ( t * xSq ) + ( c );
1584 m[0][1] = ( t * x * y ) - ( s * z );
1585 m[0][2] = ( t * x * z ) + ( s * y );
1586 m[0][3] = 0.0f;
1587
1588 m[1][0] = ( t * x * y ) + ( s * z );
1589 m[1][1] = ( t * ySq ) + ( c );
1590 m[1][2] = ( t * y * z ) - ( s * x );
1591 m[1][3] = 0.0f;
1592
1593 m[2][0] = ( t * x * z ) - ( s * y );
1594 m[2][1] = ( t * y * z ) + ( s * x );
1595 m[2][2] = ( t * zSq ) + ( c );
1596 m[2][3] = 0.0f;
1597
1598 return pOut;
1599}
1600
1602MTX34RotAxisIdx(MTX34* pOut, const VEC3* pAxis, u32 idx)
1603{
1604 MTX34RotAxisRad_(pOut, pAxis, NW_MATH_IDX_TO_RAD(idx));
1605
1606 return pOut;
1607}
1608
1610MTX34RotXYZIdx(MTX34* pOut, u32 idxX, u32 idxY, u32 idxZ)
1611{
1612 f32 sinx, cosx;
1613 f32 siny, cosy;
1614 f32 sinz, cosz;
1615 f32 f1, f2;
1616
1617 SinCosIdx(&sinx, &cosx, idxX);
1618 SinCosIdx(&siny, &cosy, idxY);
1619 SinCosIdx(&sinz, &cosz, idxZ);
1620
1621 pOut->f._20 = -siny;
1622 pOut->f._00 = cosz * cosy;
1623 pOut->f._10 = sinz * cosy;
1624 pOut->f._21 = cosy * sinx;
1625 pOut->f._22 = cosy * cosx;
1626
1627 f1 = cosx * sinz;
1628 f2 = sinx * cosz;
1629
1630 pOut->f._01 = f2 * siny - f1;
1631 pOut->f._12 = f1 * siny - f2;
1632
1633 f1 = sinx * sinz;
1634 f2 = cosx * cosz;
1635 pOut->f._02 = f2 * siny + f1;
1636 pOut->f._11 = f1 * siny + f2;
1637
1638 pOut->f._03 = 0.f;
1639 pOut->f._13 = 0.f;
1640 pOut->f._23 = 0.f;
1641
1642 return pOut;
1643}
1644
1646MTX34RotXYZTranslateIdx(MTX34* pOut, u32 idxX, u32 idxY, u32 idxZ, const VEC3* pT)
1647{
1648 (void)MTX34RotXYZIdx(pOut, idxX, idxY, idxZ);
1649 pOut->f._03 = pT->x;
1650 pOut->f._13 = pT->y;
1651 pOut->f._23 = pT->z;
1652 return pOut;
1653}
1654
1656MTX34Inverse(MTX34* pOut, const MTX34* p)
1657{
1658 return NW_MATH_IMPL_NS::MTX34Inverse(pOut, p);
1659}
1660
1662MTX34Transpose(MTX34* pOut, const MTX34* p)
1663{
1664 MTX34 mTmp;
1665
1666 const f32 (*const src)[4] = p->m;
1667 f32 (*m)[4];
1668
1669 if (p == pOut)
1670 {
1671 m = mTmp.m;
1672 }
1673 else
1674 {
1675 m = pOut->m;
1676 }
1677
1678 m[0][0] = src[0][0]; m[0][1] = src[1][0]; m[0][2] = src[2][0]; m[0][3] = 0.0f;
1679 m[1][0] = src[0][1]; m[1][1] = src[1][1]; m[1][2] = src[2][1]; m[1][3] = 0.0f;
1680 m[2][0] = src[0][2]; m[2][1] = src[1][2]; m[2][2] = src[2][2]; m[2][3] = 0.0f;
1681
1682 // copy back if needed
1683 if ( m == mTmp.m )
1684 {
1685 MTX34Copy( pOut, &mTmp );
1686 }
1687
1688 return pOut;
1689}
1690
1692MTX34InvTranspose(MTX34* pOut, const MTX34* __restrict p)
1693{
1694 return NW_MATH_IMPL_NS::MTX34InvTranspose(pOut, p);
1695}
1696
1698MTX34MultArray(MTX34* pOut, const MTX34* __restrict p1, const MTX34* __restrict pSrc, s32 count)
1699{
1700 MTX34* pOutBase = pOut;
1701
1702 for ( s32 i = 0 ; i < count ; i++ )
1703 {
1704 MTX34Mult(pOut, p1, pSrc);
1705
1706 pSrc++;
1707 pOut++;
1708 }
1709
1710 return pOutBase;
1711}
1712
1714MTX34LookAt(MTX34* pOut, const VEC3* pCamPos, const VEC3* pCamUp, const VEC3* pTarget)
1715{
1716 f32 (*const m)[4] = pOut->m;
1717
1718 // compute unit target vector
1719 // use negative value to look down (-Z) axis
1720 VEC3 vLook;
1721 VEC3Sub(&vLook, pCamPos, pTarget);
1722 VEC3Normalize(&vLook, &vLook);
1723
1724 // vRight = pCamUp x vLook
1725 VEC3 vRight;
1726 VEC3Cross(&vRight, pCamUp, &vLook);
1727 VEC3Normalize(&vRight, &vRight);
1728
1729 // vUp = vLook x vRight
1730 VEC3 vUp;
1731 VEC3Cross(&vUp, &vLook, &vRight);
1732 // Don't need to normalize vUp since it should already be unit length
1733 // VECNormalize( &vUp, &vUp );
1734
1735 m[0][0] = vRight.x;
1736 m[0][1] = vRight.y;
1737 m[0][2] = vRight.z;
1738 m[0][3] = -( pCamPos->x * vRight.x + pCamPos->y * vRight.y + pCamPos->z * vRight.z );
1739
1740 m[1][0] = vUp.x;
1741 m[1][1] = vUp.y;
1742 m[1][2] = vUp.z;
1743 m[1][3] = -( pCamPos->x * vUp.x + pCamPos->y * vUp.y + pCamPos->z * vUp.z );
1744
1745 m[2][0] = vLook.x;
1746 m[2][1] = vLook.y;
1747 m[2][2] = vLook.z;
1748 m[2][3] = -( pCamPos->x * vLook.x + pCamPos->y * vLook.y + pCamPos->z * vLook.z );
1749
1750 return pOut;
1751}
1752
1754MTX34LookAt(MTX34* pOut, const VEC3* pCamPos, f32 twist, const VEC3* pTarget)
1755{
1756 f32 (*const m)[4] = pOut->m;
1757
1758 VEC3 lookReverse(pCamPos->x - pTarget->x, pCamPos->y - pTarget->y, pCamPos->z - pTarget->z);
1759
1760 if ((lookReverse.x == 0.0f) && (lookReverse.z == 0.0f))
1761 {
1762 m[0][0] = 1.0f;
1763 m[0][1] = 0.0f;
1764 m[0][2] = 0.0f;
1765 m[0][3] = -pCamPos->x;
1766
1767 m[1][0] = 0.0f;
1768 m[1][1] = 0.0f;
1769
1770 m[2][0] = 0.0f;
1771 m[2][2] = 0.0f;
1772
1773 if (lookReverse.y <= 0.0f)
1774 {
1775 m[1][2] = 1.0f;
1776 m[1][3] = -pCamPos->z;
1777
1778 m[2][1] = -1.0f;
1779 m[2][3] = pCamPos->y;
1780 }
1781 else
1782 {
1783 m[1][2] = -1.0f;
1784 m[1][3] = pCamPos->z;
1785
1786 m[2][1] = 1.0f;
1787 m[2][3] = -pCamPos->y;
1788 }
1789 }
1790 else
1791 {
1792 VEC3 r(lookReverse.z, 0.0f, -lookReverse.x);
1793
1794 VEC3Normalize(&lookReverse, &lookReverse);
1795 VEC3Normalize(&r, &r);
1796
1797 VEC3 u;
1798 VEC3Cross(&u, &lookReverse, &r);
1799
1800 f32 st, ct;
1801 SinCosDeg(&st, &ct, twist);
1802 VEC3 right, up;
1803
1804 right.x = st * u.x + ct * r.x;
1805 right.y = st * u.y;
1806 right.z = st * u.z + ct * r.z;
1807
1808 up.x = ct * u.x - st * r.x;
1809 up.y = ct * u.y;
1810 up.z = ct * u.z - st * r.z;
1811
1812 // right
1813 m[0][0] = right.x;
1814 m[0][1] = right.y;
1815 m[0][2] = right.z;
1816 m[0][3] = -VEC3Dot(pCamPos, &right);
1817
1818 // up
1819 m[1][0] = up.x;
1820 m[1][1] = up.y;
1821 m[1][2] = up.z;
1822 m[1][3] = -VEC3Dot(pCamPos, &up);
1823
1824 // look
1825 m[2][0] = lookReverse.x;
1826 m[2][1] = lookReverse.y;
1827 m[2][2] = lookReverse.z;
1828 m[2][3] = -VEC3Dot(pCamPos, &lookReverse);
1829 }
1830
1831 return pOut;
1832}
1833
1835MTX34CameraRotate(MTX34* pOut, const VEC3* pCamPos, const VEC3* pCamRotate)
1836{
1837 f32 (*const m)[4] = pOut->m;
1838
1839 f32 sx, sy, sz, cx, cy, cz;
1840 SinCosDeg(&sx, &cx, pCamRotate->x);
1841 SinCosDeg(&sy, &cy, pCamRotate->y);
1842 SinCosDeg(&sz, &cz, pCamRotate->z);
1843
1844 VEC3 right, up, back;
1845
1846 right.x = sx * sy * sz + cy * cz;
1847 right.y = cx * sz;
1848 right.z = sx * cy * sz - sy * cz;
1849
1850 up.x = sx * sy * cz - cy * sz;
1851 up.y = cx * cz;
1852 up.z = sx * cy * cz + sy * sz;
1853
1854 back.x = cx * sy;
1855 back.y = - sx;
1856 back.z = cx * cy;
1857
1858 m[0][0] = right.x;
1859 m[0][1] = right.y;
1860 m[0][2] = right.z;
1861 m[0][3] = -VEC3Dot(pCamPos, &right);
1862
1863 m[1][0] = up.x;
1864 m[1][1] = up.y;
1865 m[1][2] = up.z;
1866 m[1][3] = -VEC3Dot(pCamPos, &up);
1867
1868 m[2][0] = back.x;
1869 m[2][1] = back.y;
1870 m[2][2] = back.z;
1871 m[2][3] = -VEC3Dot(pCamPos, &back);
1872
1873 return pOut;
1874}
1875
1877MTX34TextureProjectionFrustum(MTX34* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT)
1878{
1879 f32 reverseWidth = 1.0f / (r - l);
1880
1881 f32 (*const mtx)[4] = pOut->m;
1882
1883 mtx[0][0] = ((2.0f * n) * reverseWidth) * scaleS;
1884 mtx[0][1] = 0.0f;
1885 mtx[0][2] = (((r + l) * reverseWidth) * scaleS) - translateS;
1886 mtx[0][3] = 0.0f;
1887
1888 f32 reverseHeight = 1.0f / (t - b);
1889 mtx[1][0] = 0.0f;
1890 mtx[1][1] = ((2.0f * n) * reverseHeight) * scaleT;
1891 mtx[1][2] = (((t+ b) * reverseHeight) * scaleT) - translateT;
1892 mtx[1][3] = 0.0f;
1893
1894 mtx[2][0] = 0.0f;
1895 mtx[2][1] = 0.0f;
1896 mtx[2][2] = -1.0f;
1897 mtx[2][3] = 0.0f;
1898 return pOut;
1899}
1900
1902MTX34TextureProjectionPerspective(MTX34* pOut, f32 fovy, f32 aspect, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT)
1903{
1904 float angle = fovy * 0.5f;
1905 float cot = 1.0f / math::TanRad(angle);
1906
1907 f32 (*const mtx)[4] = pOut->m;
1908
1909 mtx[0][0] = (cot / aspect) * scaleS;
1910 mtx[0][1] = 0.0f;
1911 mtx[0][2] = -translateS;
1912 mtx[0][3] = 0.0f;
1913
1914 mtx[1][0] = 0.0f;
1915 mtx[1][1] = cot * scaleT;
1916 mtx[1][2] = -translateT;
1917 mtx[1][3] = 0.0f;
1918
1919 mtx[2][0] = 0.0f;
1920 mtx[2][1] = 0.0f;
1921 mtx[2][2] = -1.0f;
1922 mtx[2][3] = 0.0f;
1923
1924 return pOut;
1925}
1926
1928MTX34TextureProjectionOrtho(MTX34* pOut, f32 l, f32 r, f32 b, f32 t, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT)
1929{
1930 float reverseWidth = 1.0f / (r - l);
1931
1932 f32 (*const mtx)[4] = pOut->m;
1933
1934 mtx[0][0] = 2.0f * reverseWidth * scaleS;
1935 mtx[0][1] = 0.0f;
1936 mtx[0][2] = 0.0f;
1937 mtx[0][3] = ((-(r + l) * reverseWidth) * scaleS) + translateS;
1938
1939 float reverseHeight = 1.0f / (t - b);
1940 mtx[1][0] = 0.0f;
1941 mtx[1][1] = (2.0f * reverseHeight) * scaleT;
1942 mtx[1][2] = 0.0f;
1943 mtx[1][3] = ((-(t + b) * reverseHeight) * scaleT) + translateT;
1944
1945 mtx[2][0] = 0.0f;
1946 mtx[2][1] = 0.0f;
1947 mtx[2][2] = 0.0f;
1948 mtx[2][3] = 1.0f;
1949 return pOut;
1950}
1951
1953MTX34MakeSRT(MTX34* pOut, const VEC3* pS, const VEC3* pR, const VEC3* pT)
1954{
1955 f32 sinV[3];
1956 f32 cosV[3];
1957
1958 sinV[0] = SinRad( pR->x );
1959 sinV[1] = SinRad( pR->y );
1960 sinV[2] = SinRad( pR->z );
1961
1962 cosV[0] = CosRad( pR->x );
1963 cosV[1] = CosRad( pR->y );
1964 cosV[2] = CosRad( pR->z );
1965
1966 f32 opt1 = cosV[0] * cosV[2];
1967 f32 opt2 = sinV[0] * sinV[1];
1968 f32 opt3 = cosV[0] * sinV[2];
1969
1970 pOut->m[0][0] = pS->x * ( cosV[1] * cosV[2] );
1971 pOut->m[1][0] = pS->x * ( cosV[1] * sinV[2] );
1972 pOut->m[2][0] = pS->x * ( -sinV[1] );
1973
1974 pOut->m[0][1] = pS->y * ( ( opt2 * cosV[2] ) - ( opt3 ) );
1975 pOut->m[1][1] = pS->y * ( ( opt2 * sinV[2] ) + ( opt1 ));
1976 pOut->m[2][1] = pS->y * ( ( sinV[0] * cosV[1] ) );
1977
1978 pOut->m[0][2] = pS->z * ( ( opt1 * sinV[1] ) + ( sinV[0] * sinV[2] ) );
1979 pOut->m[1][2] = pS->z * ( ( opt3 * sinV[1] ) - ( sinV[0] * cosV[2] ) );
1980 pOut->m[2][2] = pS->z * ( ( cosV[0] * cosV[1] ) );
1981
1982 pOut->m[0][3] = pT->x;
1983 pOut->m[1][3] = pT->y;
1984 pOut->m[2][3] = pT->z;
1985
1986 return pOut;
1987}
1988
1990MTX34MakeST(MTX34* pOut, const VEC3* pS, const VEC3* pT)
1991{
1992 pOut->m[0][0] = pS->x;
1993 pOut->m[1][0] = 0.f;
1994 pOut->m[2][0] = 0.f;
1995
1996 pOut->m[0][1] = 0.f;
1997 pOut->m[1][1] = pS->y;
1998 pOut->m[2][1] = 0.f;
1999
2000 pOut->m[0][2] = 0.f;
2001 pOut->m[1][2] = 0.f;
2002 pOut->m[2][2] = pS->z;
2003
2004 pOut->m[0][3] = pT->x;
2005 pOut->m[1][3] = pT->y;
2006 pOut->m[2][3] = pT->z;
2007
2008 return pOut;
2009}
2010
2012MTX34MakeS(MTX34* pOut, const VEC3* pS)
2013{
2014 pOut->m[0][0] = pS->x;
2015 pOut->m[0][1] = 0.f;
2016 pOut->m[0][2] = 0.f;
2017
2018 pOut->m[1][0] = 0.f;
2019 pOut->m[1][1] = pS->y;
2020 pOut->m[1][2] = 0.f;
2021
2022 pOut->m[2][0] = 0.f;
2023 pOut->m[2][1] = 0.f;
2024 pOut->m[2][2] = pS->z;
2025
2026 pOut->m[0][3] = 0.f;
2027 pOut->m[1][3] = 0.f;
2028 pOut->m[2][3] = 0.f;
2029
2030 return pOut;
2031}
2032
2034QUATToMTX34(MTX34* pOut, const QUAT* pQ)
2035{
2036 f32 s, xs, ys, zs;
2037 f32 wx, wy, wz, xx, xy, xz, yy, yz, zz;
2038
2039 f32 (*const m)[4] = pOut->m;
2040
2041 s = 2.0f / ( (pQ->x * pQ->x) + (pQ->y * pQ->y) + (pQ->z * pQ->z) + (pQ->w * pQ->w) );
2042
2043 xs = pQ->x * s; ys = pQ->y * s; zs = pQ->z * s;
2044 wx = pQ->w * xs; wy = pQ->w * ys; wz = pQ->w * zs;
2045 xx = pQ->x * xs; xy = pQ->x * ys; xz = pQ->x * zs;
2046 yy = pQ->y * ys; yz = pQ->y * zs; zz = pQ->z * zs;
2047
2048 m[0][0] = 1.0f - (yy + zz);
2049 m[0][1] = xy - wz;
2050 m[0][2] = xz + wy;
2051 m[0][3] = 0.0f;
2052
2053 m[1][0] = xy + wz;
2054 m[1][1] = 1.0f - (xx + zz);
2055 m[1][2] = yz - wx;
2056 m[1][3] = 0.0f;
2057
2058 m[2][0] = xz - wy;
2059 m[2][1] = yz + wx;
2060 m[2][2] = 1.0f - (xx + yy);
2061 m[2][3] = 0.0f;
2062
2063 return pOut;
2064}
2065
2066} } // namespace nw::math
2067
2068#pragma clang diagnostic pop
2069
2070#endif
2071
2072#endif
#define NW_MATH_AS_INLINE
Definition math_Config.h:6
#define NW_MATH_INLINE
Definition math_Config.h:7
#define NW_MATH_IMPL_NS
Definition math_Config.h:14
Definition math_Matrix34.h:26
MTX34 * MTX34MultScale(MTX34 *pOut, const MTX34 *pM, const VEC3 *pS)
u32 MTX34Inverse(MTX34 *pOut, const MTX34 *p)
MTX34 * MTX34Add(MTX34 *pOut, const MTX34 *p1, const MTX34 *p2)
u32 MTX34InvTranspose(MTX34 *pOut, const MTX34 *p)
MTX34 * MTX34MultScale(MTX34 *pOut, const VEC3 *pS, const MTX34 *pM)
MTX34 * MTX34Mult(MTX34 *pOut, const MTX34 *p1, const MTX34 *p2)
VEC3 * VEC3Transform(VEC3 *pOut, const MTX34 *pM, const VEC3 *pV)
MTX34 * MTX34Sub(MTX34 *pOut, const MTX34 *p1, const MTX34 *p2)
MTX34 * MTX34Mult(MTX34 *pOut, const MTX34 *p, f32 f)
MTX34 * MTX34MAdd(MTX34 *pOut, f32 t, const MTX34 *p1, const MTX34 *p2)
Definition math_Matrix34.h:11
u32 MTX34Inverse(MTX34 *pOut, const MTX34 *p)
MTX34 * MTX34Mult(MTX34 *pOut, const MTX34 *p1, const MTX34 *p2)
MTX34 * MTX34Mult(MTX34 *pOut, const MTX34 *p, f32 f)
MTX34 * MTX34Sub(MTX34 *pOut, const MTX34 *p1, const MTX34 *p2)
MTX34 * MTX34MultScale(MTX34 *pOut, const VEC3 *pS, const MTX34 *pM)
u32 MTX34InvTranspose(MTX34 *pOut, const MTX34 *p)
MTX34 * MTX34Add(MTX34 *pOut, const MTX34 *p1, const MTX34 *p2)
VEC3 * VEC3Transform(VEC3 *pOut, const MTX34 *pM, const VEC3 *pV)
MTX34 * MTX34MAdd(MTX34 *pOut, f32 t, const MTX34 *p1, const MTX34 *p2)
MTX34 * MTX34MultScale(MTX34 *pOut, const MTX34 *pM, const VEC3 *pS)
Definition math_Triangular.cpp:3
Definition math_Constant.cpp:5
NW_MATH_INLINE MTX34 * MTX34RotXYZTranslateIdx(MTX34 *pOut, u32 idxX, u32 idxY, u32 idxZ, const VEC3 *pT)
NW_MATH_INLINE MTX34 * MTX34MultTranslate(MTX34 *pOut, const MTX34 *pM, const VEC3 *pT)
NW_MATH_INLINE MTX34 * MTX34MultScale(MTX34 *pOut, const MTX34 *pM, const VEC3 *pS)
VEC3 * VEC3Sub(VEC3 *pOut, const VEC3 *p1, const VEC3 *p2)
Definition math_Vector3.h:334
NW_MATH_INLINE MTX34 * MTX34Translate(MTX34 *pOut, const VEC3 *pT)
bool MTX34IsIdentity(const MTX34 &m)
Definition math_Matrix34.h:370
NW_MATH_INLINE MTX34 * MTX34Identity(MTX34 *pOut)
MTX34 * MTX34LookAt(MTX34 *pOut, const VEC3 &vCamPos, f32 twist, const VEC3 &vTarget)
Definition math_Matrix34.h:385
MTX34 * MTX34RotXYZTranslateIdx(MTX34 *pOut, u32 idxX, u32 idxY, u32 idxZ, const VEC3 &vT)
Definition math_Matrix34.h:388
NW_MATH_INLINE MTX34 * MTX34Transpose(MTX34 *pOut, const MTX34 *p)
MTX34 * MTX34LookAt(MTX34 *pOut, const VEC3 &vCamPos, const VEC3 &vCamUp, const VEC3 &vTarget)
Definition math_Matrix34.h:384
NW_MATH_INLINE MTX34 * MTX34MakeS(MTX34 *pOut, const VEC3 *pS)
MTX34 * MTX34MultTranslate(MTX34 *pOut, const MTX34 &m, const VEC3 &vT)
Definition math_Matrix34.h:398
MTX34 * MTX34Add(MTX34 *pOut, const MTX34 &m1, const MTX34 &m2)
Definition math_Matrix34.h:372
NW_MATH_INLINE MTX34 * MTX34TextureProjectionOrtho(MTX34 *pOut, f32 l, f32 r, f32 b, f32 t, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT)
NW_MATH_INLINE MTX34 * MTX34LookAt(MTX34 *pOut, const VEC3 *pCamPos, const VEC3 *pCamUp, const VEC3 *pTarget)
NW_MATH_INLINE MTX34 * MTX34LookAt(MTX34 *pOut, const VEC3 *pCamPos, f32 twist, const VEC3 *pTarget)
NW_MATH_INLINE MTX34 * MTX34MakeSRT(MTX34 *pOut, const VEC3 *pS, const VEC3 *pR, const VEC3 *pT)
MTX34 * MTX34MakeS(MTX34 *pOut, const VEC3 &s)
Definition math_Matrix34.h:403
MTX34 * MTX34MultScale(MTX34 *pOut, const MTX34 &m, const VEC3 &vS)
Definition math_Matrix34.h:394
NW_MATH_INLINE MTX34 * MTX34Sub(MTX34 *pOut, const MTX34 *p1, const MTX34 *p2)
NW_MATH_INLINE VEC3 * VEC3Cross(VEC3 *pOut, const VEC3 *p1, const VEC3 *p2)
MTX34 * MTX34Translate(MTX34 *pOut, const VEC3 &vT)
Definition math_Matrix34.h:397
MTX34 * MTX34CameraRotate(MTX34 *pOut, const VEC3 &vCamPos, const VEC3 &vCamRotate)
Definition math_Matrix34.h:386
MTX34 * MTX34RotAxisRad(MTX34 *pOut, const VEC3 *pAxis, f32 fRad)
Definition math_Matrix34.h:102
MTX34 * MTX34RotXYZRad(MTX34 *pOut, f32 fRadX, f32 fRadY, f32 fRadZ)
Definition math_Matrix34.h:90
MTX34 * MTX34MAdd(MTX34 *pOut, f32 t, const MTX34 &m1, const MTX34 &m2)
Definition math_Matrix34.h:376
NW_MATH_INLINE VEC3 * VEC3Normalize(VEC3 *pOut, const VEC3 *p)
NW_MATH_INLINE MTX34 * MTX34MultArray(MTX34 *pOut, const MTX34 *p1, const MTX34 *pSrc, s32 count)
MTX34 * MTX34MultArray(MTX34 *pOut, const MTX34 &m1, const MTX34 *pSrc, s32 count)
Definition math_Matrix34.h:379
NW_MATH_INLINE MTX34 * MTX34Scale(MTX34 *pOut, const VEC3 *pS)
NW_MATH_INLINE MTX34 * MTX34Zero(MTX34 *pOut)
u32 MTX34InvTranspose(MTX34 *pOut, const MTX34 &m)
Definition math_Matrix34.h:382
MTX34 * MTX34RotAxisRad(MTX34 *pOut, const VEC3 &vAxis, f32 fRad)
Definition math_Matrix34.h:390
NW_MATH_INLINE MTX34 * MTX34RotAxisIdx(MTX34 *pOut, const VEC3 *pAxis, u32 idx)
MTX34 * MTX34Transpose(MTX34 *pOut, const MTX34 &m)
Definition math_Matrix34.h:381
struct MTX34 Matrix34
Definition math_Matrix34.h:340
NW_MATH_INLINE bool MTX34IsIdentity(const MTX34 *p)
NW_MATH_INLINE MTX34 * MTX34CameraRotate(MTX34 *pOut, const VEC3 *pCamPos, const VEC3 *pCamRotate)
MTX34 * MTX34RotAxisIdx(MTX34 *pOut, const VEC3 &vAxis, u32 idx)
Definition math_Matrix34.h:389
MTX34 * MTX34MultScale(MTX34 *pOut, const VEC3 &vS, const MTX34 &m)
Definition math_Matrix34.h:395
MTX34 * MTX34RotAxisDeg(MTX34 *pOut, const VEC3 &vAxis, f32 fDeg)
Definition math_Matrix34.h:391
NW_FORCE_INLINE MTX34 * MTX34Mult(MTX34 *pOut, const MTX34 *p1, const MTX34 *p2)
Definition math_Matrix34.h:361
MTX34 * MTX34RotAxisDeg(MTX34 *pOut, const VEC3 *pAxis, f32 fDeg)
Definition math_Matrix34.h:108
MTX34 * QUATToMTX34(MTX34 *pOut, const QUAT &q)
Definition math_Matrix34.h:405
MTX34 * MTX34Mult(MTX34 *pOut, const MTX34 &m1, const MTX34 &m2)
Definition math_Matrix34.h:375
MTX34 * MTX34Copy(MTX34 *pOut, const MTX34 &m)
Definition math_Matrix34.h:378
MTX34 * MTX34Sub(MTX34 *pOut, const MTX34 &m1, const MTX34 &m2)
Definition math_Matrix34.h:373
MTX34 * MTX34Mult(MTX34 *pOut, const MTX34 &m, f32 f)
Definition math_Matrix34.h:374
NW_MATH_INLINE MTX34 * MTX34Mult(MTX34 *pOut, const MTX34 *p, f32 f)
NW_MATH_INLINE MTX34 * MTX34Add(MTX34 *pOut, const MTX34 *p1, const MTX34 *p2)
MTX34 * MTX34MultTranslate(MTX34 *pOut, const VEC3 &vT, const MTX34 &m)
Definition math_Matrix34.h:399
MTX34 * MTX34RotXYZDeg(MTX34 *pOut, f32 fDegX, f32 fDegY, f32 fDegZ)
Definition math_Matrix34.h:96
NW_MATH_INLINE MTX34 * MTX34MAdd(MTX34 *pOut, f32 t, const MTX34 *p1, const MTX34 *p2)
MTX34 * MTX34Scale(MTX34 *pOut, const VEC3 &vS)
Definition math_Matrix34.h:393
NW_MATH_INLINE MTX34 * MTX34MakeST(MTX34 *pOut, const VEC3 *pS, const VEC3 *pT)
NW_MATH_INLINE u32 MTX34InvTranspose(MTX34 *pOut, const MTX34 *p)
MTX34 * MTX34MakeSRT(MTX34 *pOut, const VEC3 &s, const VEC3 &r, const VEC3 &t)
Definition math_Matrix34.h:401
u32 MTX34Inverse(MTX34 *pOut, const MTX34 &m)
Definition math_Matrix34.h:380
MTX34 operator*(f32 f, const MTX34 &rhs)
Definition math_Matrix34.h:342
NW_MATH_INLINE MTX34 * MTX34RotXYZIdx(MTX34 *pOut, u32 idxX, u32 idxY, u32 idxZ)
NW_MATH_INLINE MTX34 * MTX34TextureProjectionPerspective(MTX34 *pOut, f32 fovy, f32 aspect, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT)
MTX34 * MTX34MakeST(MTX34 *pOut, const VEC3 &s, const VEC3 &t)
Definition math_Matrix34.h:402
NW_FORCE_INLINE MTX34 * MTX34Copy(MTX34 *pOut, const MTX34 *p)
Definition math_Matrix34.h:350
NW_MATH_INLINE MTX34 * MTX34TextureProjectionFrustum(MTX34 *pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 scaleS, f32 scaleT, f32 translateS, f32 translateT)
NW_MATH_INLINE MTX34 * MTX34MultScale(MTX34 *pOut, const VEC3 *pS, const MTX34 *pM)
NW_MATH_INLINE MTX34 * QUATToMTX34(MTX34 *pOut, const QUAT *p)
NW_MATH_INLINE u32 MTX34Inverse(MTX34 *pOut, const MTX34 *p)
NW_MATH_INLINE MTX34 * MTX34MultTranslate(MTX34 *pOut, const VEC3 *pT, const MTX34 *pM)
Definition math_Constant.cpp:5
Definition math_Matrix34.h:115
f32 _03
Definition math_Matrix34.h:116
f32 _12
Definition math_Matrix34.h:117
f32 _10
Definition math_Matrix34.h:117
f32 _11
Definition math_Matrix34.h:117
f32 _23
Definition math_Matrix34.h:118
f32 _21
Definition math_Matrix34.h:118
f32 _20
Definition math_Matrix34.h:118
f32 _02
Definition math_Matrix34.h:116
f32 _00
Definition math_Matrix34.h:116
f32 _22
Definition math_Matrix34.h:118
f32 _13
Definition math_Matrix34.h:117
f32 _01
Definition math_Matrix34.h:116
Definition math_Matrix34.h:113
f32 _22
Definition math_Matrix34.h:126
f32 _13
Definition math_Matrix34.h:125
f32 _20
Definition math_Matrix34.h:126
f32 _00
Definition math_Matrix34.h:124
f32 _11
Definition math_Matrix34.h:125
f32 _02
Definition math_Matrix34.h:124
f32 _03
Definition math_Matrix34.h:124
f32 _12
Definition math_Matrix34.h:125
f32 _23
Definition math_Matrix34.h:126
f32 a[12]
Definition math_Matrix34.h:130
f32 _21
Definition math_Matrix34.h:126
f32 m[3][4]
Definition math_Matrix34.h:129
f32 _01
Definition math_Matrix34.h:124
BaseData f
Definition math_Matrix34.h:128
VEC4_ v[3]
Definition math_Matrix34.h:131
f32 _10
Definition math_Matrix34.h:125
Definition math_Matrix34.h:136
MTX34 & operator=(const MTX34 &other)=default
static const MTX34 & Identity()
Definition math_Matrix34.h:141
MTX34()
Definition math_Matrix34.h:154
f32 value_type
Definition math_Matrix34.h:152
static const int COLUMN_COUNT
Definition math_Matrix34.h:139
MTX34(const f32 *p)
Definition math_Matrix34.h:156
MTX34(const MTX34 &rhs)
Definition math_Matrix34.h:158
MTX34(f32 x00, f32 x01, f32 x02, f32 x03, f32 x10, f32 x11, f32 x12, f32 x13, f32 x20, f32 x21, f32 x22, f32 x23)
Definition math_Matrix34.h:162
static const int ROW_COUNT
Definition math_Matrix34.h:138
MTX34 self_type
Definition math_Matrix34.h:151
Definition math_Vector3.h:62
#define NW_INLINE
Definition types.h:14
#define NW_FORCE_INLINE
Definition types.h:18