Skip to content

Commit d8aa9f3

Browse files
authored
tests: add unit tests for matrix class increasing math utilities coverage (#454)
* add unit tests for matrix class construction, indexing, error conditions * Revert "add unit tests for matrix class construction, indexing, error conditions" This reverts commit d80bb2c. * fix: empty content in last push * fix method call format in matrix.h * add 3x3 inverse test * fix inverse method's return type error * remove extra spaces in 3x3 test * fix format * fix mat4 param construction and handle div by zero case in inverse function; add the * operator support for mat4 * fix format issues
1 parent a467b15 commit d8aa9f3

File tree

2 files changed

+442
-39
lines changed

2 files changed

+442
-39
lines changed

ZEngine/ZEngine/Core/Maths/Matrix.h

Lines changed: 67 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ namespace ZEngine::Core::Maths
132132

133133
Mat2()
134134
{
135-
Helpers::secure_memset(m_data, 0, sizeof(m_data));
135+
Helpers::secure_memset(m_data, 0, sizeof(m_data), sizeof(m_data));
136136
}
137137

138138
Mat2(T m00, T m01, T m10, T m11)
@@ -192,7 +192,7 @@ namespace ZEngine::Core::Maths
192192

193193
Mat3()
194194
{
195-
Helpers::secure_memset(m_data, 0, sizeof(m_data));
195+
Helpers::secure_memset(m_data, 0, sizeof(m_data), sizeof(m_data));
196196
}
197197

198198
Mat3(T m00, T m01, T m02, T m10, T m11, T m12, T m20, T m21, T m22)
@@ -270,7 +270,7 @@ namespace ZEngine::Core::Maths
270270

271271
float invDet = 1.0f / dot(r2, c);
272272

273-
return Mat<T>(r0.x * invDet, r0.y * invDet, r0.z * invDet, r1.x * invDet, r1.y * invDet, r1.z * invDet, r2.x * invDet, r2.y * invDet, r2.z * invDet);
273+
return Mat3<T>(r0.x * invDet, r0.y * invDet, r0.z * invDet, r1.x * invDet, r1.y * invDet, r1.z * invDet, r2.x * invDet, r2.y * invDet, r2.z * invDet);
274274
};
275275
};
276276

@@ -280,29 +280,29 @@ namespace ZEngine::Core::Maths
280280
using Matrix<T, 4, 4>::m_data;
281281
Mat4()
282282
{
283-
Helpers::secure_memset(m_data, 0, sizeof(m_data));
283+
Helpers::secure_memset(m_data, 0, sizeof(m_data), sizeof(m_data));
284284
}
285285

286286
Mat4(T m00, T m01, T m02, T m03, T m10, T m11, T m12, T m13, T m20, T m21, T m22, T m23, T m30, T m31, T m32, T m33)
287287
{
288288
m_data[0][0] = m00;
289-
m_data[1][0] = m10;
290-
m_data[2][0] = m20;
291-
m_data[3][0] = m30;
289+
m_data[1][0] = m01;
290+
m_data[2][0] = m02;
291+
m_data[3][0] = m03;
292292

293-
m_data[0][1] = m01;
293+
m_data[0][1] = m10;
294294
m_data[1][1] = m11;
295-
m_data[2][1] = m21;
296-
m_data[3][1] = m31;
295+
m_data[2][1] = m12;
296+
m_data[3][1] = m13;
297297

298-
m_data[0][2] = m02;
299-
m_data[1][2] = m12;
298+
m_data[0][2] = m20;
299+
m_data[1][2] = m21;
300300
m_data[2][2] = m22;
301-
m_data[3][2] = m32;
301+
m_data[3][2] = m23;
302302

303-
m_data[0][3] = m03;
304-
m_data[1][3] = m13;
305-
m_data[2][3] = m23;
303+
m_data[0][3] = m30;
304+
m_data[1][3] = m31;
305+
m_data[2][3] = m32;
306306
m_data[3][3] = m33;
307307
}
308308

@@ -331,35 +331,38 @@ namespace ZEngine::Core::Maths
331331

332332
Mat4<T> Inverse() const
333333
{
334-
auto& M = *this;
334+
auto& M = *this;
335335

336-
Vec3<T> a(M(0, 0), M(1, 0), M(2, 0));
337-
Vec3<T> b(M(0, 1), M(1, 1), M(2, 1));
338-
Vec3<T> c(M(0, 2), M(1, 2), M(2, 2));
339-
Vec3<T> d(M(0, 3), M(1, 3), M(2, 3));
336+
Vec3<T> a(M(0, 0), M(0, 1), M(0, 2));
337+
Vec3<T> b(M(1, 0), M(1, 1), M(1, 2));
338+
Vec3<T> c(M(2, 0), M(2, 1), M(2, 2));
339+
Vec3<T> d(M(3, 0), M(3, 1), M(3, 2));
340340

341-
const float& x = M(0, 3);
342-
const float& y = M(1, 3);
343-
const float& z = M(2, 3);
344-
const float& w = M(3, 3);
341+
const T& x = M(0, 3);
342+
const T& y = M(1, 3);
343+
const T& z = M(2, 3);
344+
const T& w = M(3, 3);
345345

346-
Vec3<T> s = cross3d(a, b);
347-
Vec3<T> t = cross3d(c, d);
348-
Vec3<T> u = a * y - b * x;
349-
Vec3<T> v = c * w - d * z;
346+
Vec3<T> s = cross3d(a, b);
347+
Vec3<T> t = cross3d(c, d);
348+
Vec3<T> u = a * y - b * x;
349+
Vec3<T> v = c * w - d * z;
350350

351-
float invDet = T(1) / (dot(s, v) + dot(t, u));
352-
s *= invDet;
353-
t *= invDet;
354-
u *= invDet;
355-
v *= invDet;
351+
T det = dot(s, v) + dot(t, u);
352+
ZENGINE_VALIDATE_ASSERT(det != T(0), "Matrix is singular and cannot be inverted");
353+
354+
T invDet = T(1) / det;
355+
s *= invDet;
356+
t *= invDet;
357+
u *= invDet;
358+
v *= invDet;
356359

357-
Vec3<T> r0 = cross3d(b, v) + (t * y);
358-
Vec3<T> r1 = cross3d(v, a) - (t * x);
359-
Vec3<T> r2 = cross3d(d, u) + (s * w);
360-
Vec3<T> r3 = cross3d(u, c) - (s * z);
360+
Vec3<T> r0 = cross3d(b, v) + (t * y);
361+
Vec3<T> r1 = cross3d(v, a) - (t * x);
362+
Vec3<T> r2 = cross3d(d, u) + (s * w);
363+
Vec3<T> r3 = cross3d(u, c) - (s * z);
361364

362-
return Mat4<T>(r0.x, r0.y, r0.z, -dot(b, t), r1.x, r1.y, r1.z, dot(a, t), r2.x, r2.y, r2.z, -dot(d, s), r3.x, r3.y, r3.z, dot(c, s));
365+
return Mat4<T>(r0.x, r1.x, r2.x, r3.x, r0.y, r1.y, r2.y, r3.y, r0.z, r1.z, r2.z, r3.z, -dot(r0, d), -dot(r1, d), -dot(r2, a), -dot(r3, a));
363366
}
364367
};
365368

@@ -434,4 +437,29 @@ namespace ZEngine::Core::Maths
434437

435438
return m00 * (m11 * (m22 * m33 - m23 * m32) - m12 * (m21 * m33 - m23 * m31) + m13 * (m21 * m32 - m22 * m31)) - m01 * (m10 * (m22 * m33 - m23 * m32) - m12 * (m20 * m33 - m23 * m30) + m13 * (m20 * m32 - m22 * m30)) + m02 * (m10 * (m21 * m33 - m23 * m31) - m11 * (m20 * m33 - m23 * m30) + m13 * (m20 * m31 - m21 * m30)) - m03 * (m10 * (m21 * m32 - m22 * m31) - m11 * (m20 * m32 - m22 * m30) + m12 * (m20 * m31 - m21 * m30));
436439
}
440+
441+
template <typename T>
442+
inline Mat4<T> operator*(const Mat4<T>& a, const Mat4<T>& b)
443+
{
444+
return (Mat4<T>(
445+
a(0, 0) * b(0, 0) + a(0, 1) * b(1, 0) + a(0, 2) * b(2, 0) + a(0, 3) * b(3, 0),
446+
a(0, 0) * b(0, 1) + a(0, 1) * b(1, 1) + a(0, 2) * b(2, 1) + a(0, 3) * b(3, 1),
447+
a(0, 0) * b(0, 2) + a(0, 1) * b(1, 2) + a(0, 2) * b(2, 2) + a(0, 3) * b(3, 2),
448+
a(0, 0) * b(0, 3) + a(0, 1) * b(1, 3) + a(0, 2) * b(2, 3) + a(0, 3) * b(3, 3),
449+
450+
a(1, 0) * b(0, 0) + a(1, 1) * b(1, 0) + a(1, 2) * b(2, 0) + a(1, 3) * b(3, 0),
451+
a(1, 0) * b(0, 1) + a(1, 1) * b(1, 1) + a(1, 2) * b(2, 1) + a(1, 3) * b(3, 1),
452+
a(1, 0) * b(0, 2) + a(1, 1) * b(1, 2) + a(1, 2) * b(2, 2) + a(1, 3) * b(3, 2),
453+
a(1, 0) * b(0, 3) + a(1, 1) * b(1, 3) + a(1, 2) * b(2, 3) + a(1, 3) * b(3, 3),
454+
455+
a(2, 0) * b(0, 0) + a(2, 1) * b(1, 0) + a(2, 2) * b(2, 0) + a(2, 3) * b(3, 0),
456+
a(2, 0) * b(0, 1) + a(2, 1) * b(1, 1) + a(2, 2) * b(2, 1) + a(2, 3) * b(3, 1),
457+
a(2, 0) * b(0, 2) + a(2, 1) * b(1, 2) + a(2, 2) * b(2, 2) + a(2, 3) * b(3, 2),
458+
a(2, 0) * b(0, 3) + a(2, 1) * b(1, 3) + a(2, 2) * b(2, 3) + a(2, 3) * b(3, 3),
459+
460+
a(3, 0) * b(0, 0) + a(3, 1) * b(1, 0) + a(3, 2) * b(2, 0) + a(3, 3) * b(3, 0),
461+
a(3, 0) * b(0, 1) + a(3, 1) * b(1, 1) + a(3, 2) * b(2, 1) + a(3, 3) * b(3, 1),
462+
a(3, 0) * b(0, 2) + a(3, 1) * b(1, 2) + a(3, 2) * b(2, 2) + a(3, 3) * b(3, 2),
463+
a(3, 0) * b(0, 3) + a(3, 1) * b(1, 3) + a(3, 2) * b(2, 3) + a(3, 3) * b(3, 3)));
464+
}
437465
} // namespace ZEngine::Core::Maths

0 commit comments

Comments
 (0)