@@ -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