NW4F Sys
Loading...
Searching...
No Matches
math_Matrix44.h
Go to the documentation of this file.
1#ifndef NW_MATH_MATRIX44_H_
2#define NW_MATH_MATRIX44_H_
3
4//#define NW_MATH_USE_OLDMTX
5
6#if defined(NW_PLATFORM_CAFE)
7 #include <cafe/mtx/mtx44.h>
8#endif
9
10#include <cstring>
11#include <nw/math/math_Config.h>
12
13namespace nw { namespace math {
14
15struct MTX44;
16
17namespace internal { namespace standard {
18
19 VEC4* VEC3Transform(VEC4* pOut, const MTX44* pM, const VEC3* pV);
20 MTX44* MTX44Add(MTX44* pOut, const MTX44* p1, const MTX44* p2);
21 MTX44* MTX44Sub(MTX44* pOut, const MTX44* p1, const MTX44* p2);
22 MTX44* MTX44Mult(MTX44* pOut, const MTX44* p, f32 f);
23 MTX44* MTX44Mult(MTX44* pOut, const MTX44* __restrict p1, const MTX44* __restrict p2);
24 MTX44* MTX44MultScale(MTX44* pOut, const MTX44* pM, const VEC3* pS);
25 MTX44* MTX44MultScale(MTX44* pOut, const VEC3* pS, const MTX44* pM);
26
27} } // namespace internal::standard
28
29namespace internal { namespace intrinsics {
30
31 VEC4* VEC3Transform(VEC4* pOut, const MTX44* pM, const VEC3* pV);
32 MTX44* MTX44Add(MTX44* pOut, const MTX44* p1, const MTX44* p2);
33 MTX44* MTX44Sub(MTX44* pOut, const MTX44* p1, const MTX44* p2);
34 MTX44* MTX44Mult(MTX44* pOut, const MTX44* p, f32 f);
35 MTX44* MTX44Mult(MTX44* pOut, const MTX44* __restrict p1, const MTX44* __restrict p2);
36 MTX44* MTX44MultScale(MTX44* pOut, const MTX44* pM, const VEC3* pS);
37 MTX44* MTX44MultScale(MTX44* pOut, const VEC3* pS, const MTX44* pM);
38
39} } // namespace internal::intrinsics
40
45
46NW_MATH_INLINE MTX44* MTX44Add(MTX44* pOut, const MTX44* p1, const MTX44* p2);
47NW_MATH_INLINE MTX44* MTX44Sub(MTX44* pOut, const MTX44* p1, const MTX44* p2);
48NW_MATH_INLINE MTX44* MTX44Mult(MTX44* pOut, const MTX44* p, f32 f);
49NW_MATH_INLINE MTX44* MTX44Mult(MTX44* pOut, const MTX44* p1, const MTX44* p2);
50
51NW_MATH_INLINE MTX44* MTX44FrustumNew(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f);
52NW_MATH_INLINE MTX44* MTX44OrthoNew(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f);
53NW_MATH_INLINE MTX44* MTX44PerspectiveRadNew(MTX44* pOut, f32 fovyRad, f32 aspect, f32 n, f32 f);
54
55NW_MATH_INLINE MTX44* MTX44FrustumOld(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f);
56NW_MATH_INLINE MTX44* MTX44OrthoOld(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f);
57NW_MATH_INLINE MTX44* MTX44PerspectiveRadOld(MTX44* pOut, f32 fovyRad, f32 aspect, f32 n, f32 f);
58
59NW_MATH_INLINE MTX44* MTX44Frustum(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
60{
61#ifdef NW_MATH_USE_OLDMTX
62 return MTX44FrustumOld(pOut, l, r, b, t, n, f);
63#else
64 return MTX44FrustumNew(pOut, l, r, b, t, n, f);
65#endif
66}
67NW_MATH_INLINE MTX44* MTX44Ortho(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
68{
69#ifdef NW_MATH_USE_OLDMTX
70 return MTX44OrthoOld(pOut, l, r, b, t, n, f);
71#else
72 return MTX44OrthoNew(pOut, l, r, b, t, n, f);
73#endif
74}
75NW_MATH_INLINE MTX44* MTX44PerspectiveRad(MTX44* pOut, f32 fovyRad, f32 aspect, f32 n, f32 f)
76{
77#ifdef NW_MATH_USE_OLDMTX
78 return MTX44PerspectiveRadOld(pOut, fovyRad, aspect, n, f);
79#else
80 return MTX44PerspectiveRadNew(pOut, fovyRad, aspect, n, f);
81#endif
82}
83
85NW_MATH_INLINE MTX44* MTX44MultArray(MTX44* pOut, const MTX44* p1, const MTX44* pSrc, s32 count);
87
88NW_MATH_INLINE MTX44* MTX44RotXYZIdx(MTX44* pOut, u32 idxX, u32 idxY, u32 idxZ);
89NW_MATH_INLINE MTX44* MTX44RotAxisIdx(MTX44* pOut, const VEC3* pAxis, u32 idx);
90
91NW_MATH_INLINE MTX44* MTX44Scale(MTX44* pOut, const VEC3* pS);
92NW_MATH_INLINE MTX44* MTX44MultScale(MTX44* pOut, const MTX44* pM, const VEC3* pS);
93NW_MATH_INLINE MTX44* MTX44MultScale(MTX44* pOut, const VEC3* pS, const MTX44* pM);
94
95NW_MATH_INLINE MTX44* MTX44Translate(MTX44* pOut, const VEC3* pT);
96NW_MATH_INLINE MTX44* MTX44MultTranslate(MTX44* pOut, const MTX44* pM, const VEC3* pT);
97NW_MATH_INLINE MTX44* MTX44MultTranslate(MTX44* pOut, const VEC3* pT, const MTX44* pM);
98
108
109NW_MATH_INLINE MTX44* MTX44FrustumPivot(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE);
110NW_MATH_INLINE MTX44* MTX44OrthoPivot(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE);
111NW_MATH_INLINE MTX44* MTX44PerspectivePivotRad(MTX44* pOut, f32 fovyRad, f32 aspect, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE);
112
113inline MTX44*
114MTX44PerspectiveDeg(MTX44* pOut, f32 fovyDeg, f32 aspect, f32 n, f32 f)
115{
116 return MTX44PerspectiveRad(pOut, NW_MATH_DEG_TO_RAD(fovyDeg), aspect, n, f);
117}
118
119inline MTX44*
120MTX44Perspective(MTX44* pOut, f32 fovyRad, f32 aspect, f32 n, f32 f)
121{
122 return MTX44PerspectiveRad(pOut, fovyRad, aspect, n, f);
123}
124
125inline MTX44*
126MTX44PerspectivePivotDeg(MTX44* pOut, f32 fovyDeg, f32 aspect, f32 n, f32 f, PivotDirection pivot = PIVOT_NONE )
127{
128 return MTX44PerspectivePivotRad(pOut, NW_MATH_DEG_TO_RAD(fovyDeg), aspect, n, f, pivot);
129}
130
131#pragma clang diagnostic push
132#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
133
134inline MTX44*
135MTX44RotXYZRad(MTX44* pOut, f32 fRadX, f32 fRadY, f32 fRadZ)
136{
137 return MTX44RotXYZIdx(pOut, NW_MATH_RAD_TO_IDX(fRadX), NW_MATH_RAD_TO_IDX(fRadY), NW_MATH_RAD_TO_IDX(fRadZ));
138}
139
140inline MTX44*
141MTX44RotXYZDeg(MTX44* pOut, f32 fDegX, f32 fDegY, f32 fDegZ)
142{
143 return MTX44RotXYZIdx(pOut, NW_MATH_DEG_TO_IDX(fDegX), NW_MATH_DEG_TO_IDX(fDegY), NW_MATH_DEG_TO_IDX(fDegZ));
144}
145
146inline MTX44*
147MTX44RotAxisRad(MTX44* pOut, const VEC3* pAxis, f32 fRad)
148{
149 return MTX44RotAxisIdx(pOut, pAxis, NW_MATH_RAD_TO_IDX(fRad));
150}
151
152inline MTX44*
153MTX44RotAxisDeg(MTX44* pOut, const VEC3* pAxis, f32 fDeg)
154{
155 return MTX44RotAxisIdx(pOut, pAxis, NW_MATH_DEG_TO_IDX(fDeg));
156}
157
158#pragma clang diagnostic pop
159
160struct MTX34;
161
162struct MTX44_
163{
171
172 union
173 {
174 struct
175 {
180 };
182 f32 m[4][4];
183 f32 a[16];
185 };
186};
187
188struct MTX44 : public MTX44_
189{
190public:
191 static const int ROW_COUNT = 4;
192 static const int COLUMN_COUNT = 4;
193
194 static const MTX44& Identity()
195 {
196 static const MTX44 identity(
197 1.0f, 0.0f, 0.0f, 0.0f,
198 0.0f, 1.0f, 0.0f, 0.0f,
199 0.0f, 0.0f, 1.0f, 0.0f,
200 0.0f, 0.0f, 0.0f, 1.0f);
201
202 return identity;
203 }
206
207public:
208 MTX44() {}
209
210 explicit MTX44(const f32* p) { (void)MTX44Copy(this, (MTX44*)p); }
211
212 explicit MTX44(const MTX34& rhs)
213 {
214 (void)MTX34Copy((MTX34*)this, (MTX34*)&rhs);
215 f._30 = f._31 = f._32 = 0.f; f._33 = 1.f;
216 }
217
218 MTX44(const MTX44& rhs) { (void)MTX44Copy(this, &rhs); }
219
220 MTX44& operator=(const MTX44& other) = default;
221
222 MTX44(f32 x00, f32 x01, f32 x02, f32 x03,
223 f32 x10, f32 x11, f32 x12, f32 x13,
224 f32 x20, f32 x21, f32 x22, f32 x23,
225 f32 x30, f32 x31, f32 x32, f32 x33)
226 {
227 f._00 = x00; f._01 = x01; f._02 = x02; f._03 = x03;
228 f._10 = x10; f._11 = x11; f._12 = x12; f._13 = x13;
229 f._20 = x20; f._21 = x21; f._22 = x22; f._23 = x23;
230 f._30 = x30; f._31 = x31; f._32 = x32; f._33 = x33;
231 }
232
233 operator f32*() { return this->a; }
234 operator const f32*() const { return this->a; }
235
236 f32* ToF32() { return this->a; }
237 const f32* ToF32() const { return this->a; }
238
239 template <typename ToPtr>
241 {
242 return reinterpret_cast<ToPtr>( this );
243 }
244
245 template <typename ToPtr>
246 ToPtr Cast() const
247 {
248 return reinterpret_cast<ToPtr>( this );
249 }
250
251 template <typename FromPtr>
253 {
254 return reinterpret_cast<MTX44*>( fromPtr );
255 }
256
257 template <typename FromPtr>
258 static const MTX44* CastFrom(const FromPtr* fromPtr)
259 {
260 return reinterpret_cast<const MTX44*>( fromPtr );
261 }
262
263 template <typename FromPtr>
265 {
266 return *reinterpret_cast<MTX44*>( &fromPtr );
267 }
268
269 template <typename FromPtr>
270 static const MTX44& CastFrom(const FromPtr& fromPtr)
271 {
272 return *reinterpret_cast<const MTX44*>( &fromPtr );
273 }
274
276 {
277 return *reinterpret_cast<VEC4*>(&this->v[index]);
278 }
279
280 const VEC4& GetRow(int index) const
281 {
282 return *reinterpret_cast<const VEC4*>(&this->v[index]);
283 }
284
286 {
287 VEC4 column;
288 column.x = this->m[0][index];
289 column.y = this->m[1][index];
290 column.z = this->m[2][index];
291 column.w = this->m[3][index];
292 return column;
293 }
294
295 void SetColumn(int index, const VEC4& column)
296 {
297 this->m[0][index] = column.x;
298 this->m[1][index] = column.y;
299 this->m[2][index] = column.z;
300 this->m[3][index] = column.w;
301 }
302
303 self_type& operator *= (const self_type& rhs) { return *MTX44Mult(this, this, &rhs); }
304
305 self_type& operator += (const self_type& rhs) { return *MTX44Add(this, this, &rhs); }
306 self_type& operator -= (const self_type& rhs) { return *MTX44Sub(this, this, &rhs); }
307
308 self_type& operator *= (f32 x) { return *MTX44Mult(this, this, x); }
309 self_type& operator /= (f32 x) { return operator*=(1.f / x); }
310
311 self_type operator + () const { return *this; }
313 {
314 return MTX44(-f._00, -f._01, -f._02, -f._03,
315 -f._10, -f._11, -f._12, -f._13,
316 -f._20, -f._21, -f._22, -f._23,
317 -f._30, -f._31, -f._32, -f._33);
318 }
319
320 self_type operator + (const self_type& rhs) const { MTX44 tmp; return *MTX44Add(&tmp, this, &rhs); }
321 self_type operator - (const self_type& rhs) const { MTX44 tmp; return *MTX44Sub(&tmp, this, &rhs); }
322
323 self_type operator * (f32 x) const { MTX44 tmp; return *MTX44Mult(&tmp, this, x); }
324 self_type operator / (f32 x) const { return *this * (1.f / x); }
325
326 self_type& Transpose() { return *MTX44Transpose(this, this); }
327
328 self_type& SetIdentity() { return *MTX44Identity(this); }
329
331 {
332 MTX44Inverse(this, &mtx); return *this;
333 }
334
336 {
337 MTX44Inverse(this, this); return *this;
338 }
339
340 self_type& SetMult( const MTX44& lhs, const MTX44& rhs )
341 {
342 return *MTX44Mult( this, &lhs, &rhs );
343 }
344
345 self_type& SetScale(const VEC3& scale) { return *MTX44Scale(this, &scale); }
346
348 {
349 return *MTX44Translate(this, &translate);
350 }
351
353 {
354 return *MTX44RotXYZRad(this, rotate.x, rotate.y, rotate.z);
355 }
356
358 {
359 return *MTX44RotAxisRad(this, &axis, theta);
360 }
361
363 {
364 return *MTX44FrustumPivot(this, l, r, b, t, n, far, pivot);
365 }
366
368 {
369 return *MTX44OrthoPivot(this, l, r, b, t, n, far, pivot);
370 }
371
376
377 bool operator == (const self_type& rhs) const { return ::std::memcmp(this, &rhs, sizeof(MTX44)) == 0; }
378 bool operator != (const self_type& rhs) const { return ::std::memcmp(this, &rhs, sizeof(MTX44)) != 0; }
379
380 bool IsIdentity() const { return MTX44IsIdentity(this); }
381};
382
383typedef struct MTX44 Matrix44;
384
385} } // namespace nw::math
386
387namespace nw { namespace math {
388
389inline MTX44* MTX44Copy(MTX44* pOut, const MTX44& m) { return MTX44Copy( pOut, &m ); }
390inline bool MTX44IsIdentity(const MTX44& m) { return MTX44IsIdentity( &m ); }
391
392inline MTX44* MTX44Add(MTX44* pOut, const MTX44& m1, const MTX44& m2) { return MTX44Add( pOut, &m1, &m2 ); }
393inline MTX44* MTX44Sub(MTX44* pOut, const MTX44& m1, const MTX44& m2) { return MTX44Sub( pOut, &m1, &m2 ); }
394inline MTX44* MTX44Mult(MTX44* pOut, const MTX44& m, f32 f) { return MTX44Mult( pOut, &m, f ); }
395inline MTX44* MTX44Mult(MTX44* pOut, const MTX44& m1, const MTX44& m2) { return MTX44Mult( pOut, &m1, &m2 ); }
396
397inline MTX44* MTX44Transpose(MTX44* pOut, const MTX44& m) { return MTX44Transpose( pOut, &m ); }
398inline MTX44* MTX44MultArray(MTX44* pOut, const MTX44& m1, const MTX44* pSrc, s32 count) { return MTX44MultArray( pOut, &m1, pSrc, count ); }
399inline u32 MTX44Inverse(MTX44* pOut, const MTX44& m) { return MTX44Inverse( pOut, &m ); }
400
401inline MTX44* MTX44RotAxisIdx(MTX44* pOut, const VEC3& vAxis, u32 idx) { return MTX44RotAxisIdx( pOut, &vAxis, idx ); }
402inline MTX44* MTX44RotAxisRad(MTX44* pOut, const VEC3& vAxis, f32 fRad) { return MTX44RotAxisRad( pOut, &vAxis, fRad ); }
403inline MTX44* MTX44RotAxisDeg(MTX44* pOut, const VEC3& vAxis, f32 fDeg) { return MTX44RotAxisDeg( pOut, &vAxis, fDeg ); }
404
405inline MTX44* MTX44Scale(MTX44* pOut, const VEC3& S) { return MTX44Scale(pOut, &S); }
406inline MTX44* MTX44MultScale(MTX44* pOut, const MTX44& M, const VEC3& S) { return MTX44MultScale(pOut, &M, &S); }
407inline MTX44* MTX44MultScale(MTX44* pOut, const VEC3& S, const MTX44& M) { return MTX44MultScale(pOut, &S, &M); }
408
409inline MTX44* MTX44Translate(MTX44* pOut, const VEC3& T) { return MTX44Translate(pOut, &T); }
410inline MTX44* MTX44MultTranslate(MTX44* pOut, const MTX44& M, const VEC3& T) { return MTX44MultTranslate(pOut, &M, &T); }
411inline MTX44* MTX44MultTranslate(MTX44* pOut, const VEC3& T, const MTX44& M) { return MTX44MultTranslate(pOut, &T, &M); }
412
413} } // namespace nw::math
414
415#if defined(NW_MATH_AS_INLINE)
416
417#include <cmath>
418#include <nw/math/math_Vector3.h>
419
420namespace nw { namespace math {
421
422namespace internal { namespace standard {
423
424NW_MATH_INLINE VEC4*
425VEC3Transform(VEC4* pOut, const MTX44* pM, const VEC3* pV)
426{
427 VEC4 tmp;
428 tmp.x = pM->f._00 * pV->x + pM->f._01 * pV->y + pM->f._02 * pV->z + pM->f._03;
429 tmp.y = pM->f._10 * pV->x + pM->f._11 * pV->y + pM->f._12 * pV->z + pM->f._13;
430 tmp.z = pM->f._20 * pV->x + pM->f._21 * pV->y + pM->f._22 * pV->z + pM->f._23;
431 tmp.w = pM->f._30 * pV->x + pM->f._31 * pV->y + pM->f._32 * pV->z + pM->f._33;
432
433 pOut->x = tmp.x;
434 pOut->y = tmp.y;
435 pOut->z = tmp.z;
436 pOut->w = tmp.w;
437
438 return pOut;
439}
440
442MTX44Add(MTX44* pOut, const MTX44* p1, const MTX44* p2)
443{
444 pOut->f._00 = p1->f._00 + p2->f._00;
445 pOut->f._01 = p1->f._01 + p2->f._01;
446 pOut->f._02 = p1->f._02 + p2->f._02;
447 pOut->f._03 = p1->f._03 + p2->f._03;
448
449 pOut->f._10 = p1->f._10 + p2->f._10;
450 pOut->f._11 = p1->f._11 + p2->f._11;
451 pOut->f._12 = p1->f._12 + p2->f._12;
452 pOut->f._13 = p1->f._13 + p2->f._13;
453
454 pOut->f._20 = p1->f._20 + p2->f._20;
455 pOut->f._21 = p1->f._21 + p2->f._21;
456 pOut->f._22 = p1->f._22 + p2->f._22;
457 pOut->f._23 = p1->f._23 + p2->f._23;
458
459 pOut->f._30 = p1->f._30 + p2->f._30;
460 pOut->f._31 = p1->f._31 + p2->f._31;
461 pOut->f._32 = p1->f._32 + p2->f._32;
462 pOut->f._33 = p1->f._33 + p2->f._33;
463
464 return pOut;
465}
466
468MTX44Sub(MTX44* pOut, const MTX44* p1, const MTX44* p2)
469{
470 pOut->f._00 = p1->f._00 - p2->f._00;
471 pOut->f._01 = p1->f._01 - p2->f._01;
472 pOut->f._02 = p1->f._02 - p2->f._02;
473 pOut->f._03 = p1->f._03 - p2->f._03;
474
475 pOut->f._10 = p1->f._10 - p2->f._10;
476 pOut->f._11 = p1->f._11 - p2->f._11;
477 pOut->f._12 = p1->f._12 - p2->f._12;
478 pOut->f._13 = p1->f._13 - p2->f._13;
479
480 pOut->f._20 = p1->f._20 - p2->f._20;
481 pOut->f._21 = p1->f._21 - p2->f._21;
482 pOut->f._22 = p1->f._22 - p2->f._22;
483 pOut->f._23 = p1->f._23 - p2->f._23;
484
485 pOut->f._30 = p1->f._30 - p2->f._30;
486 pOut->f._31 = p1->f._31 - p2->f._31;
487 pOut->f._32 = p1->f._32 - p2->f._32;
488 pOut->f._33 = p1->f._33 - p2->f._33;
489
490 return pOut;
491}
492
494MTX44Mult(MTX44* pOut, const MTX44* p, f32 f)
495{
496 pOut->f._00 = p->f._00 * f;
497 pOut->f._01 = p->f._01 * f;
498 pOut->f._02 = p->f._02 * f;
499 pOut->f._03 = p->f._03 * f;
500
501 pOut->f._10 = p->f._10 * f;
502 pOut->f._11 = p->f._11 * f;
503 pOut->f._12 = p->f._12 * f;
504 pOut->f._13 = p->f._13 * f;
505
506 pOut->f._20 = p->f._20 * f;
507 pOut->f._21 = p->f._21 * f;
508 pOut->f._22 = p->f._22 * f;
509 pOut->f._23 = p->f._23 * f;
510
511 pOut->f._30 = p->f._30 * f;
512 pOut->f._31 = p->f._31 * f;
513 pOut->f._32 = p->f._32 * f;
514 pOut->f._33 = p->f._33 * f;
515
516 return pOut;
517}
518
520MTX44Mult(MTX44* pOut, const MTX44* __restrict p1, const MTX44* __restrict p2)
521{
522 MTX44 mTmp;
523
524 MTX44* __restrict pDst = ( pOut == p1 || pOut == p2 ) ? &mTmp : pOut;
525
526 pDst->f._00 = p1->f._00 * p2->f._00 + p1->f._01 * p2->f._10 + p1->f._02 * p2->f._20 + p1->f._03 * p2->f._30;
527 pDst->f._01 = p1->f._00 * p2->f._01 + p1->f._01 * p2->f._11 + p1->f._02 * p2->f._21 + p1->f._03 * p2->f._31;
528 pDst->f._02 = p1->f._00 * p2->f._02 + p1->f._01 * p2->f._12 + p1->f._02 * p2->f._22 + p1->f._03 * p2->f._32;
529 pDst->f._03 = p1->f._00 * p2->f._03 + p1->f._01 * p2->f._13 + p1->f._02 * p2->f._23 + p1->f._03 * p2->f._33;
530
531 pDst->f._10 = p1->f._10 * p2->f._00 + p1->f._11 * p2->f._10 + p1->f._12 * p2->f._20 + p1->f._13 * p2->f._30;
532 pDst->f._11 = p1->f._10 * p2->f._01 + p1->f._11 * p2->f._11 + p1->f._12 * p2->f._21 + p1->f._13 * p2->f._31;
533 pDst->f._12 = p1->f._10 * p2->f._02 + p1->f._11 * p2->f._12 + p1->f._12 * p2->f._22 + p1->f._13 * p2->f._32;
534 pDst->f._13 = p1->f._10 * p2->f._03 + p1->f._11 * p2->f._13 + p1->f._12 * p2->f._23 + p1->f._13 * p2->f._33;
535
536 pDst->f._20 = p1->f._20 * p2->f._00 + p1->f._21 * p2->f._10 + p1->f._22 * p2->f._20 + p1->f._23 * p2->f._30;
537 pDst->f._21 = p1->f._20 * p2->f._01 + p1->f._21 * p2->f._11 + p1->f._22 * p2->f._21 + p1->f._23 * p2->f._31;
538 pDst->f._22 = p1->f._20 * p2->f._02 + p1->f._21 * p2->f._12 + p1->f._22 * p2->f._22 + p1->f._23 * p2->f._32;
539 pDst->f._23 = p1->f._20 * p2->f._03 + p1->f._21 * p2->f._13 + p1->f._22 * p2->f._23 + p1->f._23 * p2->f._33;
540
541 pDst->f._30 = p1->f._30 * p2->f._00 + p1->f._31 * p2->f._10 + p1->f._32 * p2->f._20 + p1->f._33 * p2->f._30;
542 pDst->f._31 = p1->f._30 * p2->f._01 + p1->f._31 * p2->f._11 + p1->f._32 * p2->f._21 + p1->f._33 * p2->f._31;
543 pDst->f._32 = p1->f._30 * p2->f._02 + p1->f._31 * p2->f._12 + p1->f._32 * p2->f._22 + p1->f._33 * p2->f._32;
544 pDst->f._33 = p1->f._30 * p2->f._03 + p1->f._31 * p2->f._13 + p1->f._32 * p2->f._23 + p1->f._33 * p2->f._33;
545
546 if ( pDst != pOut )
547 {
548 nw::math::MTX44Copy( pOut, pDst );
549 }
550
551 return pOut;
552}
553
555MTX44MultScale(MTX44* pOut, const MTX44* pM, const VEC3* pS)
556{
557 pOut->f._00 = pM->f._00 * pS->x;
558 pOut->f._10 = pM->f._10 * pS->x;
559 pOut->f._20 = pM->f._20 * pS->x;
560 pOut->f._30 = pM->f._30 * pS->x;
561
562 pOut->f._01 = pM->f._01 * pS->y;
563 pOut->f._11 = pM->f._11 * pS->y;
564 pOut->f._21 = pM->f._21 * pS->y;
565 pOut->f._31 = pM->f._31 * pS->y;
566
567 pOut->f._02 = pM->f._02 * pS->z;
568 pOut->f._12 = pM->f._12 * pS->z;
569 pOut->f._22 = pM->f._22 * pS->z;
570 pOut->f._32 = pM->f._32 * pS->z;
571
572 if (pOut != pM)
573 {
574 pOut->f._03 = pM->f._03;
575 pOut->f._13 = pM->f._13;
576 pOut->f._23 = pM->f._23;
577 pOut->f._33 = pM->f._33;
578 }
579
580 return pOut;
581}
582
584MTX44MultScale(MTX44* pOut, const VEC3* pS, const MTX44* pM)
585{
586 const f32 (*const src)[4] = pM->m;
587 f32 (*const dst)[4] = pOut->m;
588
589 dst[0][0] = src[0][0] * pS->x;
590 dst[0][1] = src[0][1] * pS->x;
591 dst[0][2] = src[0][2] * pS->x;
592 dst[0][3] = src[0][3] * pS->x;
593
594 dst[1][0] = src[1][0] * pS->y;
595 dst[1][1] = src[1][1] * pS->y;
596 dst[1][2] = src[1][2] * pS->y;
597 dst[1][3] = src[1][3] * pS->y;
598
599 dst[2][0] = src[2][0] * pS->z;
600 dst[2][1] = src[2][1] * pS->z;
601 dst[2][2] = src[2][2] * pS->z;
602 dst[2][3] = src[2][3] * pS->z;
603
604 if (pOut != pM)
605 {
606 dst[3][0] = src[3][0];
607 dst[3][1] = src[3][1];
608 dst[3][2] = src[3][2];
609 dst[3][3] = src[3][3];
610 }
611
612 return pOut;
613}
614
615} } // namespace internal::standard
616
617#if defined(NW_MATH_ENABLE_INTRINSICS)
618
619namespace internal { namespace intrinsics {
620
622VEC3Transform(VEC4* pOut, const MTX44* pM, const VEC3* pV)
623{
624 const f32x2 m00m01 = __PSQ_LX(pM, offsetof(MTX44, m[0][0]), 0, 0);
625 const f32x2 m02m03 = __PSQ_LX(pM, offsetof(MTX44, m[0][2]), 0, 0);
626 const f32x2 m10m11 = __PSQ_LX(pM, offsetof(MTX44, m[1][0]), 0, 0);
627 const f32x2 m12m13 = __PSQ_LX(pM, offsetof(MTX44, m[1][2]), 0, 0);
628 const f32x2 m20m21 = __PSQ_LX(pM, offsetof(MTX44, m[2][0]), 0, 0);
629 const f32x2 m22m23 = __PSQ_LX(pM, offsetof(MTX44, m[2][2]), 0, 0);
630 const f32x2 m30m31 = __PSQ_LX(pM, offsetof(MTX44, m[3][0]), 0, 0);
631 const f32x2 m32m33 = __PSQ_LX(pM, offsetof(MTX44, m[3][2]), 0, 0);
632
633 // { xy zw } = { x y z 1 }
634 const f32x2 xy = __PSQ_LX(pV, offsetof(VEC3, x), 0, 0);
635 const f32x2 zw = __PSQ_LX(pV, offsetof(VEC3, z), 1, 0);
636
637 f32x2 fp4, fp5, fp6, fp7;
638
639 // fp4 = [ m00 m01 m02, m03 ] . T[ x y z 1 ]
640 fp4 = __PS_MUL(m00m01, xy);
642 fp4 = __PS_SUM0(fp4, fp4, fp4);
643
644 // fp5 = [ m10 m11 m12, m13 ] . T[ x y z 1 ]
645 fp5 = __PS_MUL(m10m11, xy);
647 fp5 = __PS_SUM1(fp5, fp4, fp5);
648
649 tof32x2(pOut->x) = fp5;
650
651 // fp6 = [ m20 m21 m22, m23 ] . T[ x y z 1 ]
652 fp6 = __PS_MUL(m20m21, xy);
654 fp6 = __PS_SUM0(fp6, fp6, fp6);
655
656 // fp7 = [ m30 m31 m32, m33 ] . T[ x y z 1 ]
657 fp7 = __PS_MUL(m30m31, xy);
659 fp7 = __PS_SUM1(fp7, fp6, fp7);
660
661 tof32x2(pOut->z) = fp7;
662
663 return pOut;
664}
665
667MTX44Add(MTX44* pOut, const MTX44* p1, const MTX44* p2)
668{
669 const f32x2 fp0 = __PS_ADD(tof32x2(p1->a[0] ), tof32x2(p2->a[0] ));
670 const f32x2 fp1 = __PS_ADD(tof32x2(p1->a[2] ), tof32x2(p2->a[2] ));
671 const f32x2 fp2 = __PS_ADD(tof32x2(p1->a[4] ), tof32x2(p2->a[4] ));
672 const f32x2 fp3 = __PS_ADD(tof32x2(p1->a[6] ), tof32x2(p2->a[6] ));
673 const f32x2 fp4 = __PS_ADD(tof32x2(p1->a[8] ), tof32x2(p2->a[8] ));
674 const f32x2 fp5 = __PS_ADD(tof32x2(p1->a[10]), tof32x2(p2->a[10]));
675 const f32x2 fp6 = __PS_ADD(tof32x2(p1->a[12]), tof32x2(p2->a[12]));
676 const f32x2 fp7 = __PS_ADD(tof32x2(p1->a[14]), tof32x2(p2->a[14]));
677
678 tof32x2(pOut->a[0] ) = fp0;
679 tof32x2(pOut->a[2] ) = fp1;
680 tof32x2(pOut->a[4] ) = fp2;
681 tof32x2(pOut->a[6] ) = fp3;
682 tof32x2(pOut->a[8] ) = fp4;
683 tof32x2(pOut->a[10]) = fp5;
684 tof32x2(pOut->a[12]) = fp6;
685 tof32x2(pOut->a[14]) = fp7;
686
687 return pOut;
688}
689
690
692MTX44Sub(MTX44* pOut, const MTX44* p1, const MTX44* p2)
693{
694 const f32x2 fp0 = __PS_SUB(tof32x2(p1->a[0] ), tof32x2(p2->a[0] ));
695 const f32x2 fp1 = __PS_SUB(tof32x2(p1->a[2] ), tof32x2(p2->a[2] ));
696 const f32x2 fp2 = __PS_SUB(tof32x2(p1->a[4] ), tof32x2(p2->a[4] ));
697 const f32x2 fp3 = __PS_SUB(tof32x2(p1->a[6] ), tof32x2(p2->a[6] ));
698 const f32x2 fp4 = __PS_SUB(tof32x2(p1->a[8] ), tof32x2(p2->a[8] ));
699 const f32x2 fp5 = __PS_SUB(tof32x2(p1->a[10]), tof32x2(p2->a[10]));
700 const f32x2 fp6 = __PS_SUB(tof32x2(p1->a[12]), tof32x2(p2->a[12]));
701 const f32x2 fp7 = __PS_SUB(tof32x2(p1->a[14]), tof32x2(p2->a[14]));
702
703 tof32x2(pOut->a[0] ) = fp0;
704 tof32x2(pOut->a[2] ) = fp1;
705 tof32x2(pOut->a[4] ) = fp2;
706 tof32x2(pOut->a[6] ) = fp3;
707 tof32x2(pOut->a[8] ) = fp4;
708 tof32x2(pOut->a[10]) = fp5;
709 tof32x2(pOut->a[12]) = fp6;
710 tof32x2(pOut->a[14]) = fp7;
711
712 return pOut;
713}
714
716MTX44Mult(MTX44* pOut, const MTX44* p, f32 f)
717{
718 const f32x2 fp0 = __PS_MULS0F(tof32x2(p->a[0] ), f);
719 const f32x2 fp1 = __PS_MULS0F(tof32x2(p->a[2] ), f);
720 const f32x2 fp2 = __PS_MULS0F(tof32x2(p->a[4] ), f);
721 const f32x2 fp3 = __PS_MULS0F(tof32x2(p->a[6] ), f);
722 const f32x2 fp4 = __PS_MULS0F(tof32x2(p->a[8] ), f);
723 const f32x2 fp5 = __PS_MULS0F(tof32x2(p->a[10]), f);
724 const f32x2 fp6 = __PS_MULS0F(tof32x2(p->a[12]), f);
725 const f32x2 fp7 = __PS_MULS0F(tof32x2(p->a[14]), f);
726
727 tof32x2(pOut->a[0] ) = fp0;
728 tof32x2(pOut->a[2] ) = fp1;
729 tof32x2(pOut->a[4] ) = fp2;
730 tof32x2(pOut->a[6] ) = fp3;
731 tof32x2(pOut->a[8] ) = fp4;
732 tof32x2(pOut->a[10]) = fp5;
733 tof32x2(pOut->a[12]) = fp6;
734 tof32x2(pOut->a[14]) = fp7;
735
736 return pOut;
737}
738
740MTX44Mult(MTX44* pOut, const MTX44* __restrict p1, const MTX44* __restrict p2)
741{
742 // d = a . b;
743 //
744 // { f0 f4 } = { b00 b01 b02 b03 }
745 // { f1 f5 } { b10 b11 b12 b13 }
746 // { f2 f6 } { b20 b21 b22 b23 }
747 // { f3 f7 } { b30 b31 b32 b33 }
748
749 const f32x2 f0 = __PSQ_LX(p2, offsetof(MTX44, m[0][0]), 0, 0);
750 const f32x2 f1 = __PSQ_LX(p2, offsetof(MTX44, m[1][0]), 0, 0);
751 const f32x2 f2 = __PSQ_LX(p2, offsetof(MTX44, m[2][0]), 0, 0);
752 const f32x2 f3 = __PSQ_LX(p2, offsetof(MTX44, m[3][0]), 0, 0);
753 const f32x2 f4 = __PSQ_LX(p2, offsetof(MTX44, m[0][2]), 0, 0);
754 const f32x2 f5 = __PSQ_LX(p2, offsetof(MTX44, m[1][2]), 0, 0);
755 const f32x2 f6 = __PSQ_LX(p2, offsetof(MTX44, m[2][2]), 0, 0);
756 const f32x2 f7 = __PSQ_LX(p2, offsetof(MTX44, m[3][2]), 0, 0);
757
758 f32x2 f8, f9, f10;
759
760 // { d00 d01 d02 d03 } = { f9 f10 } := { a00 a01 a02 a03 } . { f0 f4 }
761 // { f1 f5 }
762 // { f2 f6 }
763 // { f3 f7 }
764
765 f8 = __PSQ_LX(p1, offsetof(MTX44, m[0][0]), 0, 0); // { a00 a01 }
766 f9 = __PS_MULS0(f0, f8);
767 f10 = __PS_MULS0(f4, f8);
768 f9 = __PS_MADDS1(f1, f8, f9);
769 f10 = __PS_MADDS1(f5, f8, f10);
770 f8 = __PSQ_LX(p1, offsetof(MTX44, m[0][2]), 0, 0); // { a02 a03 }
771 f9 = __PS_MADDS0(f2, f8, f9);
772 f10 = __PS_MADDS0(f6, f8, f10);
773 f9 = __PS_MADDS1(f3, f8, f9);
774 f10 = __PS_MADDS1(f7, f8, f10);
775 __PSQ_STX(pOut, offsetof(MTX44, m[0][0]), f9, 0, 0);
776 __PSQ_STX(pOut, offsetof(MTX44, m[0][2]), f10, 0, 0);
777
778 // { f0 f4 }
779 // { d10 d11 d12 d13 } = { f9 f10 } := { a10 a11 a12 a13 } . { f1 f5 }
780 // { f2 f6 }
781 // { f3 f7 }
782
783 f8 = __PSQ_LX(p1, offsetof(MTX44, m[1][0]), 0, 0); // { a10 a11 }
784 f9 = __PS_MULS0(f0, f8);
785 f10 = __PS_MULS0(f4, f8);
786 f9 = __PS_MADDS1(f1, f8, f9);
787 f10 = __PS_MADDS1(f5, f8, f10);
788 f8 = __PSQ_LX(p1, offsetof(MTX44, m[1][2]), 0, 0); // { a12 a13 }
789 f9 = __PS_MADDS0(f2, f8, f9);
790 f10 = __PS_MADDS0(f6, f8, f10);
791 f9 = __PS_MADDS1(f3, f8, f9);
792 f10 = __PS_MADDS1(f7, f8, f10);
793 __PSQ_STX(pOut, offsetof(MTX44, m[1][0]), f9, 0, 0);
794 __PSQ_STX(pOut, offsetof(MTX44, m[1][2]), f10, 0, 0);
795
796 // { f0 f4 }
797 // { f1 f5 }
798 // { d20 d21 d22 d23 } = { f9 f10 } := { a20 a21 a22 a23 } . { f2 f6 }
799 // { f3 f7 }
800
801 f8 = __PSQ_LX(p1, offsetof(MTX44, m[2][0]), 0, 0); // { a20 a21 }
802 f9 = __PS_MULS0(f0, f8);
803 f10 = __PS_MULS0(f4, f8);
804 f9 = __PS_MADDS1(f1, f8, f9);
805 f10 = __PS_MADDS1(f5, f8, f10);
806 f8 = __PSQ_LX(p1, offsetof(MTX44, m[2][2]), 0, 0); // { a22 a23 }
807 f9 = __PS_MADDS0(f2, f8, f9);
808 f10 = __PS_MADDS0(f6, f8, f10);
809 f9 = __PS_MADDS1(f3, f8, f9);
810 f10 = __PS_MADDS1(f7, f8, f10);
811 __PSQ_STX(pOut, offsetof(MTX44, m[2][0]), f9, 0, 0);
812 __PSQ_STX(pOut, offsetof(MTX44, m[2][2]), f10, 0, 0);
813
814 // { f0 f4 }
815 // { f1 f5 }
816 // { f2 f6 }
817 // { d30 d31 d32 d33 } = { f9 f10 } := { a30 a31 a32 a33 } . { f3 f7 }
818
819 f8 = __PSQ_LX(p1, offsetof(MTX44, m[3][0]), 0, 0); // { a30 a31 }
820 f9 = __PS_MULS0(f0, f8);
821 f10 = __PS_MULS0(f4, f8);
822 f9 = __PS_MADDS1(f1, f8, f9);
823 f10 = __PS_MADDS1(f5, f8, f10);
824 f8 = __PSQ_LX(p1, offsetof(MTX44, m[3][2]), 0, 0); // { a32 a33 }
825 f9 = __PS_MADDS0(f2, f8, f9);
826 f10 = __PS_MADDS0(f6, f8, f10);
827 f9 = __PS_MADDS1(f3, f8, f9);
828 f10 = __PS_MADDS1(f7, f8, f10);
829 __PSQ_STX(pOut, offsetof(MTX44, m[3][0]), f9, 0, 0);
830 __PSQ_STX(pOut, offsetof(MTX44, m[3][2]), f10, 0, 0);
831
832 return pOut;
833}
834
836MTX44MultScale(MTX44* pOut, const MTX44* pM, const VEC3* pS)
837{
838 // d = m . Mscale(s)
839 //
840 // d = { m00 m01 m02 m03 } . { sx 0 0 0 }
841 // { m10 m11 m12 m13 } { 0 sy 0 0 }
842 // { m20 m21 m22 m23 } { 0 0 sz 0 }
843 // { m30 m31 m32 m33 } { 0 0 0 1 }
844 //
845 // = { sx*m00 sy*m01 sz*m02 m03 }
846 // { sx*m10 sy*m11 sz*m12 m13 }
847 // { sx*m20 sy*m21 sz*m22 m23 }
848 // { sx*m30 sy*m31 sz*m32 m33 }
849
850 // xy = { sx, sy }
851 f32x2 xy = __PSQ_LX(pS, offsetof(VEC3, x), 0, 0);
852
857
858 // z1 = { sz, 1 }
859 f32x2 z1 = __PSQ_LX(pS, offsetof(VEC3, z), 1, 0);
860
865
866 return pOut;
867}
868
870MTX44MultScale(MTX44* pOut, const VEC3* pS, const MTX44* pM)
871{
872 // d = Mscale(s) . m
873 //
874 // d = { sx 0 0 0 } . { m00 m01 m02 m03 }
875 // { 0 sy 0 0 } { m10 m11 m12 m13 }
876 // { 0 0 sz 0 } { m20 m21 m22 m23 }
877 // { 0 0 0 1 } { m30 m31 m32 m33 }
878 //
879 // = { sx*m00 sx*m01 sx*m02 sx*m03 }
880 // { sy*m10 sy*m11 sy*m12 sy*m13 }
881 // { sz*m20 sz*m21 sz*m22 sz*m23 }
882 // { m30 m31 m32 m33 }
883
884
885 f32x2 xy = tof32x2(pS->x);
886
889
892
893 f32x2 zz = __PS_FDUP(pS->z);
894
897
898 if (pOut != pM)
899 {
900 tof32x2(pOut->f._30) = tof32x2(pM->f._30);
901 tof32x2(pOut->f._32) = tof32x2(pM->f._32);
902 }
903
904 return pOut;
905}
906
907} } // namespace internal::intrinsics
908
909#endif // NW_MATH_ENABLE_INTRINSICS
910
911NW_MATH_INLINE VEC4*
912VEC3Transform(VEC4* pOut, const MTX44* pM, const VEC3* pV)
913{
914 return NW_MATH_IMPL_NS::VEC3Transform(pOut, pM, pV);
915}
916
918VEC3Transform(VEC3* pOut, const MTX44* pM, const VEC3* pV)
919{
920 return VEC3Transform(pOut, reinterpret_cast<const MTX34*>(pM), pV);
921}
922
923// NW_MATH_INLINE VEC3*
924// VEC3CalcRPY(VEC3* pOut, const MTX44* pM)
925// {
926// f32 tmp = math::FAbs(pM->_20);
927//
928// if (1.0f - tmp < math::F_ULP)
929// {
930// pOut->x = 0.f;
931// pOut->y = -math::F_PI / 2.0f * (pM->_20 / tmp);
932// pOut->z = math::Atan2Rad(-pM->_01, -pM->_20 * pM->_02);
933// }
934// else
935// {
936// pOut->x = math::Atan2Rad(pM->_21, pM->_22);
937// pOut->y = math::AsinRad(-pM->_20);
938// pOut->z = math::Atan2Rad(pM->_10, pM->_00);
939// }
940//
941// return pOut;
942// }
943
945MTX44Zero(MTX44* pOut)
946{
947 pOut->f._00 = pOut->f._01 = pOut->f._02 = pOut->f._03 =
948 pOut->f._10 = pOut->f._11 = pOut->f._12 = pOut->f._13 =
949 pOut->f._20 = pOut->f._21 = pOut->f._22 = pOut->f._23 =
950 pOut->f._30 = pOut->f._31 = pOut->f._32 = pOut->f._33 = 0.f;
951
952 return pOut;
953}
954
956MTX44Identity(MTX44* pOut)
957{
959
960 return pOut;
961}
962
964MTX44Copy(MTX44* pOut, const MTX44* p)
965{
966 if (pOut != p)
967 {
968 *pOut = *p;
969 }
970
971 return pOut;
972}
973
975MTX44Add(MTX44* pOut, const MTX44* p1, const MTX44* p2)
976{
977 return NW_MATH_IMPL_NS::MTX44Add(pOut, p1, p2);
978}
979
981MTX44Sub(MTX44* pOut, const MTX44* p1, const MTX44* p2)
982{
983 return NW_MATH_IMPL_NS::MTX44Sub(pOut, p1, p2);
984}
985
987MTX44Mult(MTX44* pOut, const MTX44* p, f32 f)
988{
989 return NW_MATH_IMPL_NS::MTX44Mult(pOut, p, f);
990}
991
993MTX44IsIdentity(const MTX44* p)
994{
995 return p->f._00 == 1.f && p->f._01 == 0.f && p->f._02 == 0.f && p->f._03 == 0.f &&
996 p->f._10 == 0.f && p->f._11 == 1.f && p->f._12 == 0.f && p->f._13 == 0.f &&
997 p->f._20 == 0.f && p->f._21 == 0.f && p->f._22 == 1.f && p->f._23 == 0.f &&
998 p->f._30 == 0.f && p->f._31 == 0.f && p->f._32 == 0.f && p->f._33 == 1.f;
999}
1000
1002MTX44Transpose(MTX44* pOut, const MTX44 *pSrc)
1003{
1004 MTX44 tmp;
1005 const MTX44 *pMtx;
1006
1007 if (pOut != pSrc)
1008 {
1009 pMtx = pSrc;
1010 pOut->f._00 = pSrc->f._00;
1011 pOut->f._11 = pSrc->f._11;
1012 pOut->f._22 = pSrc->f._22;
1013 pOut->f._33 = pSrc->f._33;
1014 }
1015 else
1016 {
1017 pMtx = &tmp;
1018 tmp.f._01 = pSrc->f._01;
1019 tmp.f._02 = pSrc->f._02;
1020 tmp.f._03 = pSrc->f._03;
1021 tmp.f._12 = pSrc->f._12;
1022 tmp.f._13 = pSrc->f._13;
1023 tmp.f._23 = pSrc->f._23;
1024 }
1025
1026 pOut->f._01 = pSrc->f._10;
1027 pOut->f._02 = pSrc->f._20;
1028 pOut->f._03 = pSrc->f._30;
1029 pOut->f._12 = pSrc->f._21;
1030 pOut->f._13 = pSrc->f._31;
1031 pOut->f._23 = pSrc->f._32;
1032
1033 pOut->f._10 = pMtx->f._01;
1034 pOut->f._20 = pMtx->f._02;
1035 pOut->f._30 = pMtx->f._03;
1036 pOut->f._21 = pMtx->f._12;
1037 pOut->f._31 = pMtx->f._13;
1038 pOut->f._32 = pMtx->f._23;
1039
1040 return pOut;
1041}
1042
1044MTX44PerspectiveRadNew(MTX44* pOut, f32 fovyRad, f32 aspect, f32 n, f32 f)
1045{
1046 f32 (*const m)[4] = pOut->m;
1047
1048 // find the cotangent of half the (YZ) field of view
1049
1050 const f32 angle = fovyRad * 0.5f;
1051
1052 const f32 cot = 1.0f / ::std::tan(angle);
1053
1054 m[0][0] = cot / aspect;
1055 m[0][1] = 0.0f;
1056 m[0][2] = 0.0f;
1057 m[0][3] = 0.0f;
1058
1059 m[1][0] = 0.0f;
1060 m[1][1] = cot;
1061 m[1][2] = 0.0f;
1062 m[1][3] = 0.0f;
1063
1064 m[2][0] = 0.0f;
1065 m[2][1] = 0.0f;
1066
1067 const f32 tmp = -1.0f / (f - n);
1068 m[2][2] = (f + n) * tmp;
1069 m[2][3] = (2 * f * n) * tmp;
1070
1071 m[3][0] = 0.0f;
1072 m[3][1] = 0.0f;
1073 m[3][2] = -1.0f;
1074 m[3][3] = 0.0f;
1075
1076 return pOut;
1077}
1078
1080MTX44PerspectiveRadOld(MTX44* pOut, f32 fovyRad, f32 aspect, f32 n, f32 f)
1081{
1082 f32 (*const m)[4] = pOut->m;
1083
1084 // find the cotangent of half the (YZ) field of view
1085
1086 const f32 angle = fovyRad * 0.5f;
1087
1088 const f32 cot = 1.0f / ::std::tan(angle);
1089
1090 m[0][0] = cot / aspect;
1091 m[0][1] = 0.0f;
1092 m[0][2] = 0.0f;
1093 m[0][3] = 0.0f;
1094
1095 m[1][0] = 0.0f;
1096 m[1][1] = cot;
1097 m[1][2] = 0.0f;
1098 m[1][3] = 0.0f;
1099
1100 m[2][0] = 0.0f;
1101 m[2][1] = 0.0f;
1102
1103 const f32 tmp = -1.0f / (f - n);
1104 m[2][2] = f * tmp;
1105 m[2][3] = f * n * tmp;
1106
1107 m[3][0] = 0.0f;
1108 m[3][1] = 0.0f;
1109 m[3][2] = -1.0f;
1110 m[3][3] = 0.0f;
1111
1112 return pOut;
1113}
1114
1116MTX44FrustumNew(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
1117{
1118 // NOTE: Be careful about "l" vs. "1" below!!!
1119
1120 f32 (*const m)[4] = pOut->m;
1121 f32 tmp = 1.0f / (r - l);
1122 m[0][0] = (2*n) * tmp;
1123 m[0][1] = 0.0f;
1124 m[0][2] = (r + l) * tmp;
1125 m[0][3] = 0.0f;
1126
1127 tmp = 1.0f / (t - b);
1128 m[1][0] = 0.0f;
1129 m[1][1] = (2*n) * tmp;
1130 m[1][2] = (t + b) * tmp;
1131 m[1][3] = 0.0f;
1132
1133 m[2][0] = 0.0f;
1134 m[2][1] = 0.0f;
1135
1136 tmp = -1.0f / (f - n);
1137 m[2][2] = (f + n) * tmp;
1138 m[2][3] = (2 * f * n) * tmp;
1139
1140 m[3][0] = 0.0f;
1141 m[3][1] = 0.0f;
1142 m[3][2] = -1.0f;
1143 m[3][3] = 0.0f;
1144
1145 return pOut;
1146}
1147
1149MTX44FrustumOld(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
1150{
1151 // NOTE: Be careful about "l" vs. "1" below!!!
1152
1153 f32 (*const m)[4] = pOut->m;
1154 f32 tmp = 1.0f / (r - l);
1155 m[0][0] = (2*n) * tmp;
1156 m[0][1] = 0.0f;
1157 m[0][2] = (r + l) * tmp;
1158 m[0][3] = 0.0f;
1159
1160 tmp = 1.0f / (t - b);
1161 m[1][0] = 0.0f;
1162 m[1][1] = (2*n) * tmp;
1163 m[1][2] = (t + b) * tmp;
1164 m[1][3] = 0.0f;
1165
1166 m[2][0] = 0.0f;
1167 m[2][1] = 0.0f;
1168
1169 tmp = -1.0f / (f - n);
1170
1171 m[2][2] = f * tmp;
1172 m[2][3] = f * n * tmp;
1173
1174 m[3][0] = 0.0f;
1175 m[3][1] = 0.0f;
1176 m[3][2] = -1.0f;
1177 m[3][3] = 0.0f;
1178
1179 return pOut;
1180}
1181
1183MTX44OrthoNew(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
1184{
1185 // NOTE: Be careful about "l" vs. "1" below!!!
1186
1187 f32 (*const m)[4] = pOut->m;
1188 f32 tmp = 1.0f / (r - l);
1189 m[0][0] = 2.0f * tmp;
1190 m[0][1] = 0.0f;
1191 m[0][2] = 0.0f;
1192 m[0][3] = -(r + l) * tmp;
1193
1194 tmp = 1.0f / (t - b);
1195 m[1][0] = 0.0f;
1196 m[1][1] = 2.0f * tmp;
1197 m[1][2] = 0.0f;
1198 m[1][3] = -(t + b) * tmp;
1199
1200 m[2][0] = 0.0f;
1201 m[2][1] = 0.0f;
1202
1203 tmp = -1.0f / (f - n);
1204 m[2][2] = 2.0f * tmp;
1205 m[2][3] = (f + n) * tmp;
1206
1207 m[3][0] = 0.0f;
1208 m[3][1] = 0.0f;
1209 m[3][2] = 0.0f;
1210 m[3][3] = 1.0f;
1211
1212 return pOut;
1213}
1214
1216MTX44OrthoOld(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
1217{
1218 // NOTE: Be careful about "l" vs. "1" below!!!
1219
1220 f32 (*const m)[4] = pOut->m;
1221 f32 tmp = 1.0f / (r - l);
1222 m[0][0] = 2.0f * tmp;
1223 m[0][1] = 0.0f;
1224 m[0][2] = 0.0f;
1225 m[0][3] = -(r + l) * tmp;
1226
1227 tmp = 1.0f / (t - b);
1228 m[1][0] = 0.0f;
1229 m[1][1] = 2.0f * tmp;
1230 m[1][2] = 0.0f;
1231 m[1][3] = -(t + b) * tmp;
1232
1233 m[2][0] = 0.0f;
1234 m[2][1] = 0.0f;
1235
1236 tmp = -1.0f / (f - n);
1237
1238 m[2][2] = tmp;
1239 m[2][3] = n * tmp;
1240
1241 m[3][0] = 0.0f;
1242 m[3][1] = 0.0f;
1243 m[3][2] = 0.0f;
1244 m[3][3] = 1.0f;
1245
1246 return pOut;
1247}
1248
1249namespace {
1250 inline MTX44*
1251 MTX44Pivot( MTX44* pOut, PivotDirection pivot )
1252 {
1253 const f32 PIVOT_ROTATION_SIN_COS[ PIVOT_NUM ][ 2 ] =
1254 {
1255 { 0.0f, 1.0f }, // NONE
1256 { 0.0f, 1.0f }, // TO_UP
1257 { -1.0f, 0.0f }, // TO_RIGHT
1258 { 0.0f, -1.0f }, // TO_BOTTOM
1259 { 1.0f, 0.0f }, // TO_LEFT
1260 };
1261
1262 if ( pivot == PIVOT_NONE )
1263 {
1264 return pOut;
1265 }
1266
1267 f32 sin = PIVOT_ROTATION_SIN_COS[ pivot ][ 0 ];
1268 f32 cos = PIVOT_ROTATION_SIN_COS[ pivot ][ 1 ];
1269
1270 f32 (*const m)[4] = pOut->m;
1271
1272 if ( sin == 0.0f )
1273 {
1274 m[0][0] = cos * m[0][0];
1275 m[0][1] = cos * m[0][1];
1276 m[0][2] = cos * m[0][2];
1277 m[0][3] = cos * m[0][3];
1278
1279 m[1][0] = cos * m[1][0];
1280 m[1][1] = cos * m[1][1];
1281 m[1][2] = cos * m[1][2];
1282 m[1][3] = cos * m[1][3];
1283 }
1284 else // if ( cos == 0.0f )
1285 {
1286 f32 tmp = m[0][0];
1287 m[0][0] = -sin * m[1][0];
1288 m[1][0] = sin * tmp;
1289
1290 tmp = m[0][1];
1291 m[0][1] = -sin * m[1][1];
1292 m[1][1] = sin * tmp;
1293
1294 tmp = m[0][2];
1295 m[0][2] = -sin * m[1][2];
1296 m[1][2] = sin * tmp;
1297
1298 tmp = m[0][3];
1299 m[0][3] = -sin * m[1][3];
1300 m[1][3] = sin * tmp;
1301 }
1302
1303 return pOut;
1304 }
1305} // namespace (unnamed)
1306
1308MTX44FrustumPivot(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f, PivotDirection pivot)
1309{
1310 nw::math::MTX44Frustum( pOut, l, r, b, t, n, f );
1311 MTX44Pivot( pOut, pivot );
1312
1313 return pOut;
1314}
1315
1317MTX44OrthoPivot(MTX44* pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f, PivotDirection pivot)
1318{
1319 nw::math::MTX44Ortho( pOut, l, r, b, t, n, f );
1320 MTX44Pivot( pOut, pivot );
1321
1322 return pOut;
1323}
1324
1326MTX44PerspectivePivotRad(MTX44* pOut, f32 fovy, f32 aspect, f32 n, f32 f, PivotDirection pivot)
1327{
1328 nw::math::MTX44PerspectiveRad( pOut, fovy, aspect, n, f );
1329 MTX44Pivot( pOut, pivot );
1330
1331 return pOut;
1332}
1333
1335MTX44Mult(MTX44* pOut, const MTX44* __restrict p1, const MTX44* __restrict p2)
1336{
1337 return NW_MATH_IMPL_NS::MTX44Mult(pOut, p1, p2);
1338}
1339
1341MTX44MultArray(MTX44* pOut, const MTX44* __restrict p1, const MTX44* __restrict pSrc, s32 count)
1342{
1343 MTX44* pOutBase = pOut;
1344
1345 for ( s32 i = 0 ; i < count ; i++ )
1346 {
1347 nw::math::MTX44Mult(pOut, p1, pSrc);
1348
1349 pSrc++;
1350 pOut++;
1351 }
1352
1353 return pOutBase;
1354}
1355
1356namespace {
1357 inline void SwapF(f32 &a, f32 &b)
1358 {
1359 f32 tmp;
1360 tmp = a;
1361 a = b;
1362 b = tmp;
1363 }
1364} // namespace (unnamed)
1365
1367MTX44Inverse(MTX44* pOut, const MTX44* p)
1368{
1369 MTX44 mTmp;
1370 f32 (*src)[4];
1371 f32 (*inv)[4];
1372 f32 w;
1373
1376
1377 src = mTmp.m;
1378 inv = pOut->m;
1379
1380 for (int i = 0; i < 4; ++i)
1381 {
1382 f32 max = 0.0f;
1383 s32 swp = i;
1384
1385 // ---- partial pivoting -----
1386 for(int k = i ; k < 4 ; k++ )
1387 {
1388 f32 ftmp;
1389 ftmp = ::std::fabs(src[k][i]);
1390 if ( ftmp > max )
1391 {
1392 max = ftmp;
1393 swp = k;
1394 }
1395 }
1396
1397 // check singular matrix
1398 //(or can't solve inverse matrix with this algorithm)
1399 if ( max == 0.0f )
1400 {
1401 return 0;
1402 }
1403
1404 // swap row
1405 if ( swp != i )
1406 {
1407 for (int k = 0; k < 4; k++)
1408 {
1409 SwapF(src[i][k], src[swp][k]);
1410 SwapF(inv[i][k], inv[swp][k]);
1411 }
1412 }
1413
1414 // ---- pivoting end ----
1415
1416 w = 1.0f / src[i][i];
1417 for (int j = 0; j < 4; ++j)
1418 {
1419 src[i][j] *= w;
1420 inv[i][j] *= w;
1421 }
1422
1423 for (int k = 0; k < 4; ++k )
1424 {
1425 if ( k == i )
1426 continue;
1427
1428 w = src[k][i];
1429 for (int j = 0; j < 4; ++j)
1430 {
1431 src[k][j] -= src[i][j] * w;
1432 inv[k][j] -= inv[i][j] * w;
1433 }
1434 }
1435 }
1436
1437 return 1;
1438}
1439
1440static NW_MATH_INLINE MTX44*
1441MTX44RotAxisRad_( MTX44* pOut, const VEC3 *pAxis, f32 fRad )
1442{
1443 VEC3 vN;
1444 f32 s, c; // sinTheta, cosTheta
1445 f32 t; // ( 1 - cosTheta )
1446 f32 x, y, z; // x, y, z components of normalized axis
1447 f32 xSq, ySq, zSq; // x, y, z squared
1448
1449
1450 f32 (*const m)[4] = pOut->m;
1451
1452 s = ::std::sin(fRad);
1453 c = ::std::cos(fRad);
1454 t = 1.0f - c;
1455
1456 VEC3Normalize( &vN, pAxis );
1457
1458 x = vN.x;
1459 y = vN.y;
1460 z = vN.z;
1461
1462 xSq = x * x;
1463 ySq = y * y;
1464 zSq = z * z;
1465
1466 m[0][0] = ( t * xSq ) + ( c );
1467 m[0][1] = ( t * x * y ) - ( s * z );
1468 m[0][2] = ( t * x * z ) + ( s * y );
1469 m[0][3] = 0.0f;
1470
1471 m[1][0] = ( t * x * y ) + ( s * z );
1472 m[1][1] = ( t * ySq ) + ( c );
1473 m[1][2] = ( t * y * z ) - ( s * x );
1474 m[1][3] = 0.0f;
1475
1476 m[2][0] = ( t * x * z ) - ( s * y );
1477 m[2][1] = ( t * y * z ) + ( s * x );
1478 m[2][2] = ( t * zSq ) + ( c );
1479 m[2][3] = 0.0f;
1480
1481 m[3][0] = 0.0f;
1482 m[3][1] = 0.0f;
1483 m[3][2] = 0.0f;
1484 m[3][3] = 1.0f;
1485
1486 return pOut;
1487}
1488
1489#pragma clang diagnostic push
1490#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
1491
1493MTX44RotAxisIdx(MTX44* pOut, const VEC3* pAxis, u32 idx)
1494{
1495 MTX44RotAxisRad_(pOut, pAxis, NW_MATH_IDX_TO_RAD(idx));
1496 return pOut;
1497}
1498
1499#pragma clang diagnostic pop
1500
1502MTX44RotXYZIdx(MTX44* pOut, u32 idxX, u32 idxY, u32 idxZ)
1503{
1504 f32 sinx, cosx;
1505 f32 siny, cosy;
1506 f32 sinz, cosz;
1507 f32 f1, f2;
1508
1509 SinCosIdx(&sinx, &cosx, idxX);
1510 SinCosIdx(&siny, &cosy, idxY);
1511 SinCosIdx(&sinz, &cosz, idxZ);
1512
1513 pOut->f._20 = -siny;
1514 pOut->f._00 = cosz * cosy;
1515 pOut->f._10 = sinz * cosy;
1516 pOut->f._21 = cosy * sinx;
1517 pOut->f._22 = cosy * cosx;
1518
1519 f1 = cosx * sinz;
1520 f2 = sinx * cosz;
1521
1522 pOut->f._01 = f2 * siny - f1;
1523 pOut->f._12 = f1 * siny - f2;
1524
1525 f1 = sinx * sinz;
1526 f2 = cosx * cosz;
1527 pOut->f._02 = f2 * siny + f1;
1528 pOut->f._11 = f1 * siny + f2;
1529
1530 pOut->f._03 = 0.f;
1531 pOut->f._13 = 0.f;
1532 pOut->f._23 = 0.f;
1533
1534 pOut->f._30 = 0.0f;
1535 pOut->f._31 = 0.0f;
1536 pOut->f._32 = 0.0f;
1537 pOut->f._33 = 1.0f;
1538
1539 return pOut;
1540}
1541
1543MTX44Scale(MTX44* pOut, const VEC3* pS)
1544{
1545 f32 (*const m)[4] = pOut->m;
1546
1547 m[0][0] = pS->x; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f;
1548 m[1][0] = 0.0f; m[1][1] = pS->y; m[1][2] = 0.0f; m[1][3] = 0.0f;
1549 m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = pS->z; m[2][3] = 0.0f;
1550 m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f;
1551
1552 return pOut;
1553}
1554
1556MTX44MultScale(MTX44* pOut, const MTX44* pM, const VEC3* pS)
1557{
1558 return NW_MATH_IMPL_NS::MTX44MultScale(pOut, pM, pS);
1559}
1560
1562MTX44MultScale(MTX44* pOut, const VEC3* pS, const MTX44* pM)
1563{
1564 return NW_MATH_IMPL_NS::MTX44MultScale(pOut, pS, pM);
1565}
1566
1568MTX44Translate(MTX44* pOut, const VEC3* pT)
1569{
1570 f32 (*const m)[4] = pOut->m;
1571
1572 m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = pT->x;
1573 m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = pT->y;
1574 m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = pT->z;
1575 m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f;
1576
1577 return pOut;
1578}
1579
1581MTX44MultTranslate(MTX44* pOut, const VEC3* pT, const MTX44* pM)
1582{
1583 const f32 (*const src)[4] = pM->m;
1584 f32 (*const dst)[4] = pOut->m;
1585
1586 if ( src != dst )
1587 {
1588 dst[0][0] = src[0][0]; dst[0][1] = src[0][1]; dst[0][2] = src[0][2];
1589 dst[1][0] = src[1][0]; dst[1][1] = src[1][1]; dst[1][2] = src[1][2];
1590 dst[2][0] = src[2][0]; dst[2][1] = src[2][1]; dst[2][2] = src[2][2];
1591 }
1592
1593 dst[0][3] = src[0][3] + pT->x;
1594 dst[1][3] = src[1][3] + pT->y;
1595 dst[2][3] = src[2][3] + pT->z;
1596
1597 return pOut;
1598}
1599
1601MTX44MultTranslate(MTX44* pOut, const MTX44* pM, const VEC3* pT)
1602{
1603 // pOut = pM * pT
1604 if (pOut != pM)
1605 {
1606 (void)MTX44Copy(pOut, pM);
1607 }
1608
1609 VEC4 tmp;
1610 VEC3Transform(&tmp, pM, pT);
1611
1612 pOut->f._03 = tmp.x;
1613 pOut->f._13 = tmp.y;
1614 pOut->f._23 = tmp.z;
1615
1616 return pOut;
1617}
1618
1619} } // namespace nw::math
1620
1621#endif
1622
1623#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
MTX44 * MTX44Mult(MTX44 *pOut, const MTX44 *__restrict p1, const MTX44 *__restrict p2)
MTX44 * MTX44MultScale(MTX44 *pOut, const VEC3 *pS, const MTX44 *pM)
MTX44 * MTX44Add(MTX44 *pOut, const MTX44 *p1, const MTX44 *p2)
MTX44 * MTX44Sub(MTX44 *pOut, const MTX44 *p1, const MTX44 *p2)
MTX44 * MTX44MultScale(MTX44 *pOut, const MTX44 *pM, const VEC3 *pS)
MTX44 * MTX44Mult(MTX44 *pOut, const MTX44 *p, f32 f)
VEC4 * VEC3Transform(VEC4 *pOut, const MTX44 *pM, const VEC3 *pV)
Definition math_Matrix34.h:11
MTX44 * MTX44Mult(MTX44 *pOut, const MTX44 *p, f32 f)
MTX44 * MTX44MultScale(MTX44 *pOut, const VEC3 *pS, const MTX44 *pM)
VEC4 * VEC3Transform(VEC4 *pOut, const MTX44 *pM, const VEC3 *pV)
MTX44 * MTX44MultScale(MTX44 *pOut, const MTX44 *pM, const VEC3 *pS)
MTX44 * MTX44Add(MTX44 *pOut, const MTX44 *p1, const MTX44 *p2)
MTX44 * MTX44Sub(MTX44 *pOut, const MTX44 *p1, const MTX44 *p2)
MTX44 * MTX44Mult(MTX44 *pOut, const MTX44 *__restrict p1, const MTX44 *__restrict p2)
Definition math_Triangular.cpp:3
Definition math_Constant.cpp:5
NW_MATH_INLINE MTX44 * MTX44Frustum(MTX44 *pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
Definition math_Matrix44.h:59
NW_MATH_INLINE MTX44 * MTX44FrustumOld(MTX44 *pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
NW_MATH_INLINE MTX44 * MTX44Mult(MTX44 *pOut, const MTX44 *p1, const MTX44 *p2)
MTX44 * MTX44Transpose(MTX44 *pOut, const MTX44 &m)
Definition math_Matrix44.h:397
MTX44 * MTX44RotAxisIdx(MTX44 *pOut, const VEC3 &vAxis, u32 idx)
Definition math_Matrix44.h:401
MTX44 * MTX44MultArray(MTX44 *pOut, const MTX44 &m1, const MTX44 *pSrc, s32 count)
Definition math_Matrix44.h:398
MTX44 * MTX44MultScale(MTX44 *pOut, const VEC3 &S, const MTX44 &M)
Definition math_Matrix44.h:407
MTX44 * MTX44MultTranslate(MTX44 *pOut, const MTX44 &M, const VEC3 &T)
Definition math_Matrix44.h:410
MTX44 * MTX44PerspectiveDeg(MTX44 *pOut, f32 fovyDeg, f32 aspect, f32 n, f32 f)
Definition math_Matrix44.h:114
NW_MATH_INLINE MTX44 * MTX44PerspectivePivotRad(MTX44 *pOut, f32 fovyRad, f32 aspect, f32 n, f32 f, PivotDirection pivot=PIVOT_NONE)
MTX44 * MTX44Add(MTX44 *pOut, const MTX44 &m1, const MTX44 &m2)
Definition math_Matrix44.h:392
MTX44 * MTX44Copy(MTX44 *pOut, const MTX44 &m)
Definition math_Matrix44.h:389
MTX44 * MTX44Scale(MTX44 *pOut, const VEC3 &S)
Definition math_Matrix44.h:405
NW_MATH_INLINE MTX44 * MTX44FrustumNew(MTX44 *pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
MTX44 * MTX44RotAxisRad(MTX44 *pOut, const VEC3 *pAxis, f32 fRad)
Definition math_Matrix44.h:147
NW_MATH_INLINE MTX44 * MTX44FrustumPivot(MTX44 *pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f, PivotDirection pivot=PIVOT_NONE)
NW_MATH_INLINE MTX44 * MTX44MultScale(MTX44 *pOut, const MTX44 *pM, const VEC3 *pS)
NW_MATH_INLINE MTX44 * MTX44Add(MTX44 *pOut, const MTX44 *p1, const MTX44 *p2)
MTX44 * MTX44Mult(MTX44 *pOut, const MTX44 &m1, const MTX44 &m2)
Definition math_Matrix44.h:395
NW_MATH_INLINE MTX44 * MTX44Mult(MTX44 *pOut, const MTX44 *p, f32 f)
NW_MATH_INLINE MTX44 * MTX44Identity(MTX44 *pOut)
NW_MATH_INLINE MTX44 * MTX44RotAxisIdx(MTX44 *pOut, const VEC3 *pAxis, u32 idx)
NW_MATH_INLINE MTX44 * MTX44OrthoNew(MTX44 *pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
NW_MATH_INLINE VEC3 * VEC3Normalize(VEC3 *pOut, const VEC3 *p)
NW_MATH_INLINE MTX44 * MTX44Transpose(MTX44 *pOut, const MTX44 *pSrc)
NW_MATH_INLINE MTX44 * MTX44Ortho(MTX44 *pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
Definition math_Matrix44.h:67
MTX44 * MTX44Mult(MTX44 *pOut, const MTX44 &m, f32 f)
Definition math_Matrix44.h:394
NW_MATH_INLINE MTX44 * MTX44MultTranslate(MTX44 *pOut, const VEC3 *pT, const MTX44 *pM)
struct MTX44 Matrix44
Definition math_Matrix44.h:383
NW_MATH_INLINE MTX44 * MTX44MultArray(MTX44 *pOut, const MTX44 *p1, const MTX44 *pSrc, s32 count)
NW_MATH_INLINE MTX44 * MTX44Copy(MTX44 *pOut, const MTX44 *p)
NW_MATH_INLINE MTX44 * MTX44Zero(MTX44 *pOut)
NW_MATH_INLINE MTX44 * MTX44Scale(MTX44 *pOut, const VEC3 *pS)
NW_MATH_INLINE MTX44 * MTX44Translate(MTX44 *pOut, const VEC3 *pT)
bool MTX44IsIdentity(const MTX44 &m)
Definition math_Matrix44.h:390
MTX44 * MTX44RotXYZRad(MTX44 *pOut, f32 fRadX, f32 fRadY, f32 fRadZ)
Definition math_Matrix44.h:135
NW_MATH_INLINE MTX44 * MTX44PerspectiveRadNew(MTX44 *pOut, f32 fovyRad, f32 aspect, f32 n, f32 f)
MTX44 * MTX44PerspectivePivotDeg(MTX44 *pOut, f32 fovyDeg, f32 aspect, f32 n, f32 f, PivotDirection pivot=PIVOT_NONE)
Definition math_Matrix44.h:126
MTX44 * MTX44Perspective(MTX44 *pOut, f32 fovyRad, f32 aspect, f32 n, f32 f)
Definition math_Matrix44.h:120
NW_MATH_INLINE MTX44 * MTX44PerspectiveRad(MTX44 *pOut, f32 fovyRad, f32 aspect, f32 n, f32 f)
Definition math_Matrix44.h:75
MTX44 * MTX44Sub(MTX44 *pOut, const MTX44 &m1, const MTX44 &m2)
Definition math_Matrix44.h:393
NW_MATH_INLINE MTX44 * MTX44MultTranslate(MTX44 *pOut, const MTX44 *pM, const VEC3 *pT)
NW_MATH_INLINE MTX44 * MTX44PerspectiveRadOld(MTX44 *pOut, f32 fovyRad, f32 aspect, f32 n, f32 f)
NW_MATH_INLINE MTX44 * MTX44Sub(MTX44 *pOut, const MTX44 *p1, const MTX44 *p2)
MTX44 * MTX44RotAxisRad(MTX44 *pOut, const VEC3 &vAxis, f32 fRad)
Definition math_Matrix44.h:402
PivotDirection
Definition math_Matrix44.h:100
@ PIVOT_UPSIDE_TO_TOP
Definition math_Matrix44.h:102
@ PIVOT_NONE
Definition math_Matrix44.h:101
@ PIVOT_NUM
Definition math_Matrix44.h:106
@ PIVOT_UPSIDE_TO_BOTTOM
Definition math_Matrix44.h:104
@ PIVOT_UPSIDE_TO_LEFT
Definition math_Matrix44.h:105
@ PIVOT_UPSIDE_TO_RIGHT
Definition math_Matrix44.h:103
MTX44 * MTX44Translate(MTX44 *pOut, const VEC3 &T)
Definition math_Matrix44.h:409
NW_MATH_INLINE MTX44 * MTX44OrthoOld(MTX44 *pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f)
NW_MATH_INLINE MTX44 * MTX44OrthoPivot(MTX44 *pOut, f32 l, f32 r, f32 b, f32 t, f32 n, f32 f, PivotDirection pivot=PIVOT_NONE)
u32 MTX44Inverse(MTX44 *pOut, const MTX44 &m)
Definition math_Matrix44.h:399
MTX44 * MTX44RotAxisDeg(MTX44 *pOut, const VEC3 *pAxis, f32 fDeg)
Definition math_Matrix44.h:153
MTX44 * MTX44MultScale(MTX44 *pOut, const MTX44 &M, const VEC3 &S)
Definition math_Matrix44.h:406
NW_MATH_INLINE u32 MTX44Inverse(MTX44 *pOut, const MTX44 *p)
NW_MATH_INLINE MTX44 * MTX44MultScale(MTX44 *pOut, const VEC3 *pS, const MTX44 *pM)
MTX44 * MTX44MultTranslate(MTX44 *pOut, const VEC3 &T, const MTX44 &M)
Definition math_Matrix44.h:411
NW_MATH_INLINE MTX44 * MTX44RotXYZIdx(MTX44 *pOut, u32 idxX, u32 idxY, u32 idxZ)
MTX44 * MTX44RotAxisDeg(MTX44 *pOut, const VEC3 &vAxis, f32 fDeg)
Definition math_Matrix44.h:403
MTX44 * MTX44RotXYZDeg(MTX44 *pOut, f32 fDegX, f32 fDegY, f32 fDegZ)
Definition math_Matrix44.h:141
NW_MATH_INLINE bool MTX44IsIdentity(const MTX44 *p)
Definition math_Constant.cpp:5
Definition math_Matrix34.h:136
Definition math_Matrix44.h:165
f32 _00
Definition math_Matrix44.h:166
f32 _12
Definition math_Matrix44.h:167
f32 _31
Definition math_Matrix44.h:169
f32 _33
Definition math_Matrix44.h:169
f32 _30
Definition math_Matrix44.h:169
f32 _13
Definition math_Matrix44.h:167
f32 _22
Definition math_Matrix44.h:168
f32 _21
Definition math_Matrix44.h:168
f32 _02
Definition math_Matrix44.h:166
f32 _32
Definition math_Matrix44.h:169
f32 _01
Definition math_Matrix44.h:166
f32 _11
Definition math_Matrix44.h:167
f32 _10
Definition math_Matrix44.h:167
f32 _03
Definition math_Matrix44.h:166
f32 _23
Definition math_Matrix44.h:168
f32 _20
Definition math_Matrix44.h:168
Definition math_Matrix44.h:163
f32 _02
Definition math_Matrix44.h:176
f32 a[16]
Definition math_Matrix44.h:183
f32 _00
Definition math_Matrix44.h:176
f32 _32
Definition math_Matrix44.h:179
f32 _20
Definition math_Matrix44.h:178
f32 _10
Definition math_Matrix44.h:177
f32 m[4][4]
Definition math_Matrix44.h:182
f32 _03
Definition math_Matrix44.h:176
f32 _31
Definition math_Matrix44.h:179
f32 _12
Definition math_Matrix44.h:177
f32 _33
Definition math_Matrix44.h:179
f32 _23
Definition math_Matrix44.h:178
f32 _22
Definition math_Matrix44.h:178
f32 _13
Definition math_Matrix44.h:177
f32 _30
Definition math_Matrix44.h:179
VEC4_ v[4]
Definition math_Matrix44.h:184
f32 _21
Definition math_Matrix44.h:178
f32 _01
Definition math_Matrix44.h:176
f32 _11
Definition math_Matrix44.h:177
BaseData f
Definition math_Matrix44.h:181
Definition math_Matrix44.h:189
MTX44 & operator=(const MTX44 &other)=default
MTX44(f32 x00, f32 x01, f32 x02, f32 x03, f32 x10, f32 x11, f32 x12, f32 x13, f32 x20, f32 x21, f32 x22, f32 x23, f32 x30, f32 x31, f32 x32, f32 x33)
Definition math_Matrix44.h:222
MTX44(const MTX34 &rhs)
Definition math_Matrix44.h:212
MTX44 self_type
Definition math_Matrix44.h:204
MTX44(const MTX44 &rhs)
Definition math_Matrix44.h:218
f32 value_type
Definition math_Matrix44.h:205
static const MTX44 & Identity()
Definition math_Matrix44.h:194
static const int ROW_COUNT
Definition math_Matrix44.h:191
static const int COLUMN_COUNT
Definition math_Matrix44.h:192
MTX44()
Definition math_Matrix44.h:208
MTX44(const f32 *p)
Definition math_Matrix44.h:210
Definition math_Vector3.h:62