1#ifndef NW_MATH_MATRIX34_H_
2#define NW_MATH_MATRIX34_H_
5#include <nw/math/math_Config.h>
7namespace nw {
namespace math {
86#pragma clang diagnostic push
87#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
92 return MTX34RotXYZIdx(pOut, NW_MATH_RAD_TO_IDX(fRadX), NW_MATH_RAD_TO_IDX(fRadY), NW_MATH_RAD_TO_IDX(fRadZ));
98 return MTX34RotXYZIdx(pOut, NW_MATH_DEG_TO_IDX(fDegX), NW_MATH_DEG_TO_IDX(fDegY), NW_MATH_DEG_TO_IDX(fDegZ));
104 return MTX34RotAxisIdx(pOut, pAxis, NW_MATH_RAD_TO_IDX(fRad));
110 return MTX34RotAxisIdx(pOut, pAxis, NW_MATH_DEG_TO_IDX(fDeg));
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);
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)
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;
204 return *
reinterpret_cast<
VEC4*>(&
this->
v[
index]);
209 return *
reinterpret_cast<
const VEC4*>(&
this->
v[
index]);
345 (
void)MTX34Mult(&tmp, &rhs, f);
368namespace nw {
namespace math {
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 ); }
401inline MTX34*
MTX34MakeSRT(
MTX34* pOut,
const VEC3& s,
const VEC3& r,
const VEC3& t) {
return MTX34MakeSRT( pOut, &s, &r, &t ); }
412#include <nw/math/math_Vector3.h>
414namespace nw {
namespace math {
419VEC3Transform(
VEC3* pOut,
const MTX34*
__restrict pM,
const VEC3*
__restrict pV)
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
516 pOut->f._03 = pM->f._03;
517 pOut->f._13 = pM->f._13;
518 pOut->f._23 = pM->f._23;
526MTX34MultScale(
MTX34* pOut,
const VEC3*
__restrict pS,
const MTX34* pM)
528 const f32 (*
const src)[4] = pM->m;
529 f32 (*
const dst)[4] = pOut->m;
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;
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;
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;
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;
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;
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;
570 MTX34*
__restrict pDst = (pOut == p1 || pOut == p2) ? &mTmp : pOut;
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;
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;
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;
603 f32 (*
const inv)[4] = pOut->m;
604 const f32 (*
const src)[4] = p->m;
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];
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;
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;
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;
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];
669 f32 (*
const invX)[4] = pOut->m;
670 const f32 (*
const src)[4] = p->m;
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];
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;
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;
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;
731#if defined(NW_MATH_ENABLE_INTRINSICS)
1107 if(
fp7[0] == 0.0f &&
fp7[1] == 0.0f)
1329 if(
fp7[0] == 0.0f &&
fp7[1] == 0.0f)
1406VEC3Transform(
VEC3* pOut,
const MTX34*
__restrict pM,
const VEC3*
__restrict pV)
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;
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;
1479 f32 (*
const m)[4] = pOut->m;
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;
1495MTX34MultScale(
MTX34* pOut,
const VEC3*
__restrict pS,
const MTX34* pM)
1501MTX34Translate(
MTX34* pOut,
const VEC3* pT)
1503 f32 (*
const m)[4] = pOut->m;
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;
1515 const f32 (*
const src)[4] = pM->m;
1516 f32 (*
const dst)[4] = pOut->m;
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];
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;
1542 VEC3Transform(&tmp, pM, pT);
1544 pOut->f._03 = tmp.x;
1545 pOut->f._13 = tmp.y;
1546 pOut->f._23 = tmp.z;
1558MTX34RotAxisRad_(
MTX34* pOut,
const VEC3 *pAxis, f32 fRad )
1567 f32 (*
const m)[4] = pOut->m;
1569 s = ::std::sin(fRad);
1570 c = ::std::cos(fRad);
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 );
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 );
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 );
1602MTX34RotAxisIdx(
MTX34* pOut,
const VEC3* pAxis, u32 idx)
1604 MTX34RotAxisRad_(pOut, pAxis, NW_MATH_IDX_TO_RAD(idx));
1617 SinCosIdx(&sinx, &cosx, idxX);
1618 SinCosIdx(&siny, &cosy, idxY);
1619 SinCosIdx(&sinz, &cosz, idxZ);
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;
1630 pOut->f._01 = f2 * siny - f1;
1631 pOut->f._12 = f1 * siny - f2;
1635 pOut->f._02 = f2 * siny + f1;
1636 pOut->f._11 = f1 * siny + f2;
1646MTX34RotXYZTranslateIdx(
MTX34* pOut, u32 idxX, u32 idxY, u32 idxZ,
const VEC3* pT)
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;
1666 const f32 (*
const src)[4] = p->m;
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;
1700 MTX34* pOutBase = pOut;
1702 for ( s32 i = 0 ; i < count ; i++ )
1714MTX34LookAt(
MTX34* pOut,
const VEC3* pCamPos,
const VEC3* pCamUp,
const VEC3* pTarget)
1716 f32 (*
const m)[4] = pOut->m;
1738 m[0][3] = -( pCamPos->x * vRight.x + pCamPos->y * vRight.y + pCamPos->z * vRight.z );
1743 m[1][3] = -( pCamPos->x * vUp.x + pCamPos->y * vUp.y + pCamPos->z * vUp.z );
1748 m[2][3] = -( pCamPos->x * vLook.x + pCamPos->y * vLook.y + pCamPos->z * vLook.z );
1754MTX34LookAt(
MTX34* pOut,
const VEC3* pCamPos, f32 twist,
const VEC3* pTarget)
1756 f32 (*
const m)[4] = pOut->m;
1758 VEC3 lookReverse(pCamPos->x - pTarget->x, pCamPos->y - pTarget->y, pCamPos->z - pTarget->z);
1760 if ((lookReverse.x == 0.0f) && (lookReverse.z == 0.0f))
1765 m[0][3] = -pCamPos->x;
1773 if (lookReverse.y <= 0.0f)
1776 m[1][3] = -pCamPos->z;
1779 m[2][3] = pCamPos->y;
1784 m[1][3] = pCamPos->z;
1787 m[2][3] = -pCamPos->y;
1792 VEC3 r(lookReverse.z, 0.0f, -lookReverse.x);
1801 SinCosDeg(&st, &ct, twist);
1804 right.x = st * u.x + ct * r.x;
1806 right.z = st * u.z + ct * r.z;
1808 up.x = ct * u.x - st * r.x;
1810 up.z = ct * u.z - st * r.z;
1816 m[0][3] = -VEC3Dot(pCamPos, &right);
1822 m[1][3] = -VEC3Dot(pCamPos, &up);
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);
1835MTX34CameraRotate(
MTX34* pOut,
const VEC3* pCamPos,
const VEC3* pCamRotate)
1837 f32 (*
const m)[4] = pOut->m;
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);
1844 VEC3 right, up, back;
1846 right.x = sx * sy * sz + cy * cz;
1848 right.z = sx * cy * sz - sy * cz;
1850 up.x = sx * sy * cz - cy * sz;
1852 up.z = sx * cy * cz + sy * sz;
1861 m[0][3] = -VEC3Dot(pCamPos, &right);
1866 m[1][3] = -VEC3Dot(pCamPos, &up);
1871 m[2][3] = -VEC3Dot(pCamPos, &back);
1879 f32 reverseWidth = 1.0f / (r - l);
1881 f32 (*
const mtx)[4] = pOut->m;
1883 mtx[0][0] = ((2.0f * n) * reverseWidth) * scaleS;
1885 mtx[0][2] = (((r + l) * reverseWidth) * scaleS) - translateS;
1888 f32 reverseHeight = 1.0f / (t - b);
1890 mtx[1][1] = ((2.0f * n) * reverseHeight) * scaleT;
1891 mtx[1][2] = (((t+ b) * reverseHeight) * scaleT) - translateT;
1904 float angle = fovy * 0.5f;
1905 float cot = 1.0f / math::TanRad(angle);
1907 f32 (*
const mtx)[4] = pOut->m;
1909 mtx[0][0] = (cot / aspect) * scaleS;
1911 mtx[0][2] = -translateS;
1915 mtx[1][1] = cot * scaleT;
1916 mtx[1][2] = -translateT;
1930 float reverseWidth = 1.0f / (r - l);
1932 f32 (*
const mtx)[4] = pOut->m;
1934 mtx[0][0] = 2.0f * reverseWidth * scaleS;
1937 mtx[0][3] = ((-(r + l) * reverseWidth) * scaleS) + translateS;
1939 float reverseHeight = 1.0f / (t - b);
1941 mtx[1][1] = (2.0f * reverseHeight) * scaleT;
1943 mtx[1][3] = ((-(t + b) * reverseHeight) * scaleT) + translateT;
1958 sinV[0] = SinRad( pR->x );
1959 sinV[1] = SinRad( pR->y );
1960 sinV[2] = SinRad( pR->z );
1962 cosV[0] = CosRad( pR->x );
1963 cosV[1] = CosRad( pR->y );
1964 cosV[2] = CosRad( pR->z );
1966 f32 opt1 = cosV[0] * cosV[2];
1967 f32 opt2 = sinV[0] * sinV[1];
1968 f32 opt3 = cosV[0] * sinV[2];
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] );
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] ) );
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] ) );
1982 pOut->m[0][3] = pT->x;
1983 pOut->m[1][3] = pT->y;
1984 pOut->m[2][3] = pT->z;
1992 pOut->m[0][0] = pS->x;
1993 pOut->m[1][0] = 0.f;
1994 pOut->m[2][0] = 0.f;
1996 pOut->m[0][1] = 0.f;
1997 pOut->m[1][1] = pS->y;
1998 pOut->m[2][1] = 0.f;
2000 pOut->m[0][2] = 0.f;
2001 pOut->m[1][2] = 0.f;
2002 pOut->m[2][2] = pS->z;
2004 pOut->m[0][3] = pT->x;
2005 pOut->m[1][3] = pT->y;
2006 pOut->m[2][3] = pT->z;
2014 pOut->m[0][0] = pS->x;
2015 pOut->m[0][1] = 0.f;
2016 pOut->m[0][2] = 0.f;
2018 pOut->m[1][0] = 0.f;
2019 pOut->m[1][1] = pS->y;
2020 pOut->m[1][2] = 0.f;
2022 pOut->m[2][0] = 0.f;
2023 pOut->m[2][1] = 0.f;
2024 pOut->m[2][2] = pS->z;
2026 pOut->m[0][3] = 0.f;
2027 pOut->m[1][3] = 0.f;
2028 pOut->m[2][3] = 0.f;
2037 f32 wx, wy, wz, xx, xy, xz, yy, yz, zz;
2039 f32 (*
const m)[4] = pOut->m;
2041 s = 2.0f / ( (pQ->x * pQ->x) + (pQ->y * pQ->y) + (pQ->z * pQ->z) + (pQ->w * pQ->w) );
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;
2048 m[0][0] = 1.0f - (yy + zz);
2054 m[1][1] = 1.0f - (xx + zz);
2060 m[2][2] = 1.0f - (xx + yy);
2068#pragma clang diagnostic pop
#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