@@ -132,7 +132,7 @@ namespace ZEngine::Core::Maths
132
132
133
133
Mat2 ()
134
134
{
135
- Helpers::secure_memset (m_data, 0 , sizeof (m_data));
135
+ Helpers::secure_memset (m_data, 0 , sizeof (m_data), sizeof (m_data) );
136
136
}
137
137
138
138
Mat2 (T m00, T m01, T m10, T m11)
@@ -192,7 +192,7 @@ namespace ZEngine::Core::Maths
192
192
193
193
Mat3 ()
194
194
{
195
- Helpers::secure_memset (m_data, 0 , sizeof (m_data));
195
+ Helpers::secure_memset (m_data, 0 , sizeof (m_data), sizeof (m_data) );
196
196
}
197
197
198
198
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
270
270
271
271
float invDet = 1 .0f / dot (r2, c);
272
272
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);
274
274
};
275
275
};
276
276
@@ -280,29 +280,29 @@ namespace ZEngine::Core::Maths
280
280
using Matrix<T, 4 , 4 >::m_data;
281
281
Mat4 ()
282
282
{
283
- Helpers::secure_memset (m_data, 0 , sizeof (m_data));
283
+ Helpers::secure_memset (m_data, 0 , sizeof (m_data), sizeof (m_data) );
284
284
}
285
285
286
286
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)
287
287
{
288
288
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 ;
292
292
293
- m_data[0 ][1 ] = m01 ;
293
+ m_data[0 ][1 ] = m10 ;
294
294
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 ;
297
297
298
- m_data[0 ][2 ] = m02 ;
299
- m_data[1 ][2 ] = m12 ;
298
+ m_data[0 ][2 ] = m20 ;
299
+ m_data[1 ][2 ] = m21 ;
300
300
m_data[2 ][2 ] = m22;
301
- m_data[3 ][2 ] = m32 ;
301
+ m_data[3 ][2 ] = m23 ;
302
302
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 ;
306
306
m_data[3 ][3 ] = m33;
307
307
}
308
308
@@ -331,35 +331,38 @@ namespace ZEngine::Core::Maths
331
331
332
332
Mat4<T> Inverse () const
333
333
{
334
- auto & M = *this ;
334
+ auto & M = *this ;
335
335
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 ));
340
340
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 );
345
345
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;
350
350
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;
356
359
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);
361
364
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 ));
363
366
}
364
367
};
365
368
@@ -434,4 +437,29 @@ namespace ZEngine::Core::Maths
434
437
435
438
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));
436
439
}
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
+ }
437
465
} // namespace ZEngine::Core::Maths
0 commit comments