11 template <
typename T =
float>
22 for (
UInt_8 i = 0; i < 16; ++i)
26 explicit Mat4(
const T* data)
28 for (
UInt_8 i = 0; i < 16; ++i)
29 this->data[i] = data[i];
35 for (
UInt_8 i = 0; i < 9; ++i)
39 UInt_8 dst = row * 4 + column;
41 data[dst] = (T)mat[i];
56 for (
UInt_8 i = 0; i < 16; ++i)
57 data[i] = (T)mat.data[i];
66 for (
UInt_8 i = 0; i < 16; ++i)
67 data[i] = (T)mat.data[i];
75 result.
x = vec.
x * data[0] + vec.
y * data[4] + vec.
z * data[8] + vec.
w * data[12];
76 result.
y = vec.
x * data[1] + vec.
y * data[5] + vec.
z * data[9] + vec.
w * data[13];
77 result.
z = vec.
x * data[2] + vec.
y * data[6] + vec.
z * data[10] + vec.
w * data[14];
78 result.
w = vec.
x * data[3] + vec.
y * data[7] + vec.
z * data[11] + vec.
w * data[15];
85 for (
UInt_8 i = 0; i < 16; ++i)
94 for (
UInt_8 i = 0; i < 16; ++i)
95 result.data[i] = data[i] * scalar;
104 for (
UInt_8 i = 0; i < 16; i++)
107 UInt_8 column = i % 4 * 4;
108 data[i] += transposed.data[column] * mat.data[row];
109 data[i] += transposed.data[column + 1] * mat.data[row + 1];
110 data[i] += transposed.data[column + 2] * mat.data[row + 2];
111 data[i] += transposed.data[column + 3] * mat.data[row + 3];
122 for (
UInt_8 i = 0; i < 16; i++)
125 UInt_8 column = i % 4 * 4;
126 result.data[i] += transposed.data[column] * mat.data[row];
127 result.data[i] += transposed.data[column + 1] * mat.data[row + 1];
128 result.data[i] += transposed.data[column + 2] * mat.data[row + 2];
129 result.data[i] += transposed.data[column + 3] * mat.data[row + 3];
135 operator const T*()
const
147 return Vec3<T>(data[0], data[4], data[8]);
152 return Vec3<T>(data[1], data[5], data[9]);
157 return Vec3<T>(data[2], data[6], data[10]);
163 for (
UInt_8 i = 0; i < 16; ++i)
164 result.data[i] = data[i % 4 * 4 + i / 4];
172 for (
UInt_8 i = 0; i < 16; ++i)
173 data[i] = old.data[4 * (i % 4) + i / 4];
181 for (
UInt_8 r = 0; r < 4; ++r)
183 for (
UInt_8 c = 0; c < 4; ++c)
185 if (r == row || c == column)
188 result[index++] = data[4 * r + c];
199 for (
UInt_8 r = 0; r < 4; ++r)
200 for (
UInt_8 c = 0; c < 4; ++c)
201 result.data[4 * r + c] =
Cut(r, c).GetDeterminant();
210 for (
UInt_8 r = 0; r < 4; ++r)
211 for (
UInt_8 c = 0; c < 4; ++c)
212 data[4 * r + c] = old.
Cut(r, c).GetDeterminant();
220 for (
UInt_8 r = 0; r < 4; ++r)
222 for (
UInt_8 c = 0; c < 4; ++c)
225 result.data[i] = minor.data[i] *
Math::Pow<T>(-1, r + c);
236 for (
UInt_8 r = 0; r < 4; ++r)
238 for (
UInt_8 c = 0; c < 4; ++c)
251 for (
UInt_8 c = 0; c < 4; ++c)
252 result += data[c] * cofactor[c];
300 result.data[0] = scale.
x;
301 result.data[5] = scale.
y;
302 result.data[10] = scale.
z;
311 result.data[12] = pos.
x;
312 result.data[13] = pos.
y;
313 result.data[14] = pos.
z;
373 result[0] = 1.0f / (aspect * tanHalfFovy);
374 result[5] = -1.0f / tanHalfFovy;
375 result[10] = zFar / (zFar - zNear);
376 result[14] = -(zFar * zNear) / (zFar - zNear);
386 result[0] = 1.0f / (aspect * tanHalfFovy);
387 result[5] = -1.0f / tanHalfFovy;
388 result[10] = zFar / (zFar - zNear);
390 result[14] = -(zFar * zNear) / (zFar - zNear);
399 result[0] = 2.0f / (right - left);
400 result[5] = 2.0f / (bottom - top);
401 result[10] = 1.0f / (zFar - zNear);
402 result[12] = -(right + left) / (right - left);
403 result[13] = -(bottom + top) / (bottom - top);
404 result[14] = -zNear / (zFar - zNear);
static Mat4< T > RH_Perspective(const T fov, const T aspect, const T zNear, const T zFar)
Definition Mat4.h:368
static Mat4< T > Rotate(const Vec3< T > &vec)
Definition Mat4.h:363
Vec3< T > GetRight() const
Definition Mat4.h:145
Vec3< T > GetUp() const
Definition Mat4.h:150
Mat4< T > GetMinor() const
Definition Mat4.h:195
Mat4< T > GetInverse() const
Definition Mat4.h:268
friend class GpuUniform
Definition Mat4.h:15
Mat4< T > GetTranspose() const
Definition Mat4.h:160
static Mat4< T > LH_Perspective(const T fov, const T aspect, const T zNear, const T zFar)
Definition Mat4.h:381
static Mat4< T > Identity()
Definition Mat4.h:287
void Cofactor()
Definition Mat4.h:232
Mat4< T > GetCofactor() const
Definition Mat4.h:215
static Mat4< T > RollRotate(const T angle)
Definition Mat4.h:348
static Mat4< T > Scale(const Vec3< T > &scale)
Definition Mat4.h:297
Mat3< T > Cut(const UInt_8 row, const UInt_8 column) const
Definition Mat4.h:176
static Mat4< T > LH_Orthographic(const T left, const T right, const T top, const T bottom, const T zNear, const T zFar)
Definition Mat4.h:396
Mat4(const Mat4< C > &mat)
Definition Mat4.h:54
Vec3< T > GetForward() const
Definition Mat4.h:155
Mat4(const T *data)
Definition Mat4.h:26
Mat4< T > GetAdjugate() const
Definition Mat4.h:257
void Minor()
Definition Mat4.h:206
Mat4< T > & operator*=(const T scalar)
Definition Mat4.h:83
Mat4< T > operator*(const Mat4< T > &mat) const
Definition Mat4.h:117
static Mat4< T > Translate(const Vec3< T > &pos)
Definition Mat4.h:308
Mat4()
Definition Mat4.h:20
Vec4< T > operator*(Vec4< T > vec) const
Definition Mat4.h:72
void Adjugate()
Definition Mat4.h:262
T GetDeterminant() const
Definition Mat4.h:246
static Mat4< T > YawRotate(const T angle)
Definition Mat4.h:333
Mat4< T > & operator=(const Mat4< C > &mat)
Definition Mat4.h:61
Mat4(const Mat3< C > &mat)
Definition Mat4.h:33
Mat4< T > operator*(const T scalar) const
Definition Mat4.h:91
Mat4< T > & operator*=(const Mat4< T > &mat)
Definition Mat4.h:100
static Mat4< T > PitchRotate(const T angle)
Definition Mat4.h:318
void Inverse()
Definition Mat4.h:277
void Transpose()
Definition Mat4.h:169
static T Pow(const T base, const I exponent)
Definition Math.h:173
static T Rads(const T from)
Definition Math.h:89
static R Sin(const R angle, const R precision=0.001)
Definition Math.h:257
static R Cos(const R angle, const R precision=0.001)
Definition Math.h:298
static R Tan(const R angle, const R precision=0.001)
Definition Math.h:334
static bool ComCmp(float a, float b)
Combined absolute and relative tolerance comparison for single precision floats.
Definition Math.cpp:26
unsigned char UInt_8
Definition Types.h:43
Mat4< double > Mat4_d
Definition Mat4.h:428
Mat4< float > Mat4_f
Definition Mat4.h:427