#pragma once #include "Core/Math/Boilerplate.h" #include "Core/Math/Detail/Matrix4Decl.inl" #include "Core/Math/SIMD/SIMDIntrinsics.h" #include "Core/Math/SIMD/PhanesSIMDTypes.h" namespace Phanes::Core::Math { template T Determinant(const TMatrix4& m) { return Detail::compute_mat4_det::map(m); } template bool InverseV(TMatrix4& a) { return Detail::compute_mat4_inv::map(a, a); } template TMatrix4& TransposeV(TMatrix4& a) { Detail::compute_mat4_transpose::map(a, a); return a; } template bool Inverse(const TMatrix4& m, Ref> r) { return Detail::compute_mat4_inv::map(*r, m); } template TMatrix4 Transpose(TMatrix4& a) { TMatrix4 r; Detail::compute_mat4_transpose::map(r, a); return r; } template TMatrix4& operator*= (TMatrix4& m1, const TMatrix4& m2) { TMatrix4 r; Detail::compute_mat4_mul::map(r, m1, m2); return (m1 = r); } template TMatrix4 operator* (const TMatrix4& m1, const TMatrix4& m2) { TMatrix4 r; Detail::compute_mat4_mul::map(r, m1, m2); return r; } template TVector4 operator* (const TMatrix4& m1, const TVector4& v) { TVector4 r; Detail::compute_mat4_mul::map(r, m1, v); return r; } }