76 inline explicit Matrix(
const float (&_m)[16])
78 for (
int i = 0; i < 16; ++i)
87 inline explicit Matrix(
const float (&_m)[4][4])
89 for (
int c = 0; c < 4; ++c)
91 for (
int r = 0; r < 4; ++r)
104 inline void Set(
int row,
int col,
float value)
106 m[(col-1)*4+(row-1)] = value;
115 inline float Get(
int row,
int col)
117 return m[(col-1)*4+(row-1)];
123 for (
int i = 0; i < 16; ++i)
140 return reinterpret_cast<float*
>(
this);
159 for (
int i = 0; i < 4; ++i)
174 assert(r >= 0 && r <= 3);
175 assert(c >= 0 && c <= 3);
188 result = +
m[5 ] * (
m[10] *
m[15] -
m[14] *
m[11])
189 -
m[9 ] * (
m[6 ] *
m[15] -
m[14] *
m[7 ])
190 + m[13] * (m[6 ] * m[11] - m[10] * m[7 ]);
198 result = - m[1 ] * (m[10] * m[15] - m[14] * m[11])
199 + m[9 ] * (m[2 ] * m[15] - m[14] * m[3 ])
200 - m[13] * (m[2 ] * m[11] - m[10] * m[3 ]);
208 result = + m[1 ] * (m[6 ] * m[15] - m[14] * m[7 ])
209 - m[5 ] * (m[2 ] * m[15] - m[14] * m[3 ])
210 + m[13] * (m[2 ] * m[7 ] - m[6 ] * m[3 ]);
218 result = - m[1 ] * (m[6 ] * m[11] - m[10] * m[7 ])
219 + m[5 ] * (m[2 ] * m[11] - m[10] * m[3 ])
220 - m[9 ] * (m[2 ] * m[7 ] - m[6 ] * m[3 ]);
228 result = - m[4 ] * (m[10] * m[15] - m[14] * m[11])
229 + m[8 ] * (m[6 ] * m[15] - m[14] * m[7 ])
230 - m[12] * (m[6 ] * m[11] - m[10] * m[7 ]);
238 result = + m[0 ] * (m[10] * m[15] - m[14] * m[11])
239 - m[8 ] * (m[2 ] * m[15] - m[14] * m[3 ])
240 + m[12] * (m[2 ] * m[11] - m[10] * m[3 ]);
248 result = - m[0 ] * (m[6 ] * m[15] - m[14] * m[7 ])
249 + m[4 ] * (m[2 ] * m[15] - m[14] * m[3 ])
250 - m[12] * (m[2 ] * m[7 ] - m[6 ] * m[3 ]);
258 result = + m[0 ] * (m[6 ] * m[11] - m[10] * m[7 ])
259 - m[4 ] * (m[2 ] * m[11] - m[10] * m[3 ])
260 + m[8 ] * (m[2 ] * m[7 ] - m[6 ] * m[3 ]);
268 result = + m[4 ] * (m[9 ] * m[15] - m[13] * m[11])
269 - m[8 ] * (m[5 ] * m[15] - m[13] * m[7 ])
270 + m[12] * (m[5 ] * m[11] - m[9 ] * m[7 ]);
278 result = - m[0 ] * (m[9 ] * m[15] - m[13] * m[11])
279 + m[8 ] * (m[1 ] * m[15] - m[13] * m[3 ])
280 - m[12] * (m[1 ] * m[11] - m[9 ] * m[3 ]);
288 result = + m[0 ] * (m[5 ] * m[15] - m[13] * m[7 ])
289 - m[4 ] * (m[1 ] * m[15] - m[13] * m[3 ])
290 + m[12] * (m[1 ] * m[7 ] - m[5 ] * m[3 ]);
298 result = - m[0 ] * (m[5 ] * m[11] - m[9 ] * m[7 ])
299 + m[4 ] * (m[1 ] * m[11] - m[9 ] * m[3 ])
300 - m[8 ] * (m[1 ] * m[7 ] - m[5 ] * m[3 ]);
308 result = - m[4 ] * (m[9 ] * m[14] - m[13] * m[10])
309 + m[8 ] * (m[5 ] * m[14] - m[13] * m[6 ])
310 - m[12] * (m[5 ] * m[10] - m[9 ] * m[6 ]);
318 result = + m[0 ] * (m[9 ] * m[14] - m[13] * m[10])
319 - m[8 ] * (m[1 ] * m[14] - m[13] * m[2 ])
320 + m[12] * (m[1 ] * m[10] - m[9 ] * m[2 ]);
328 result = - m[0 ] * (m[5 ] * m[14] - m[13] * m[6 ])
329 + m[4 ] * (m[1 ] * m[14] - m[13] * m[2 ])
330 - m[12] * (m[1 ] * m[6 ] - m[5 ] * m[2 ]);
338 result = + m[0 ] * (m[5 ] * m[10] - m[9 ] * m[6 ])
339 - m[4 ] * (m[1 ] * m[10] - m[9 ] * m[2 ])
340 + m[8 ] * (m[1 ] * m[6 ] - m[5 ] * m[2 ]);
360 float result[16] = { 0.0f };
362 for (
int r = 0; r < 4; ++r)
364 for (
int c = 0; c < 4; ++c)
367 result[4*r+c] = (1.0f / d) *
Cofactor(r, c);
381 float result[16] = { 0.0f };
383 for (
int c = 0; c < 4; ++c)
385 for (
int r = 0; r < 4; ++r)
387 result[4*c+r] = 0.0f;
388 for (
int i = 0; i < 4; ++i)
390 result[4*c+r] +=
m[4*i+r] * right.
m[4*c+i];
403 for (
int i = 0; i < 16; ++i)
405 if (!
IsEqual(m1.
m[i], m2.
m[i], tolerance))
444 float x = v.
x * m.
m[0 ] + v.
y * m.
m[4 ] + v.
z * m.
m[8 ] + m.
m[12];
445 float y = v.
x * m.
m[1 ] + v.
y * m.
m[5 ] + v.
z * m.
m[9 ] + m.
m[13];
446 float z = v.
x * m.
m[2 ] + v.
y * m.
m[6 ] + v.
z * m.
m[10] + m.
m[14];
451 float w = v.
x * m.
m[3 ] + v.
y * m.
m[7 ] + v.
z * m.
m[11] + m.
m[15];