/// @ref core /// @file glm/detail/func_matrix_simd.inl #if GLM_ARCH & GLM_ARCH_SSE2_BIT #include "type_mat4x4.hpp" #include "func_geometric.hpp" #include "../simd/matrix.h" namespace glm{ namespace detail { template struct compute_matrixCompMult { GLM_STATIC_ASSERT(detail::is_aligned

::value, "Specialization requires aligned"); GLM_FUNC_QUALIFIER static tmat4x4 call(tmat4x4 const & x, tmat4x4 const & y) { tmat4x4 result(uninitialize); glm_mat4_matrixCompMult( *(glm_vec4 const (*)[4])&x[0].data, *(glm_vec4 const (*)[4])&y[0].data, *(glm_vec4(*)[4])&result[0].data); return result; } }; template struct compute_transpose { GLM_FUNC_QUALIFIER static tmat4x4 call(tmat4x4 const & m) { tmat4x4 result(uninitialize); glm_mat4_transpose( *(glm_vec4 const (*)[4])&m[0].data, *(glm_vec4(*)[4])&result[0].data); return result; } }; template struct compute_determinant { GLM_FUNC_QUALIFIER static float call(tmat4x4 const& m) { return _mm_cvtss_f32(glm_mat4_determinant(*reinterpret_cast<__m128 const(*)[4]>(&m[0].data))); } }; template struct compute_inverse { GLM_FUNC_QUALIFIER static tmat4x4 call(tmat4x4 const& m) { tmat4x4 Result(uninitialize); glm_mat4_inverse(*reinterpret_cast<__m128 const(*)[4]>(&m[0].data), *reinterpret_cast<__m128(*)[4]>(&Result[0].data)); return Result; } }; }//namespace detail template<> GLM_FUNC_QUALIFIER tmat4x4 outerProduct(tvec4 const & c, tvec4 const & r) { tmat4x4 m(uninitialize); glm_mat4_outerProduct(c.data, r.data, *reinterpret_cast<__m128(*)[4]>(&m[0].data)); return m; } template<> GLM_FUNC_QUALIFIER tmat4x4 outerProduct(tvec4 const & c, tvec4 const & r) { tmat4x4 m(uninitialize); glm_mat4_outerProduct(c.data, r.data, *reinterpret_cast<__m128(*)[4]>(&m[0].data)); return m; } template<> GLM_FUNC_QUALIFIER tmat4x4 outerProduct(tvec4 const & c, tvec4 const & r) { tmat4x4 m(uninitialize); glm_mat4_outerProduct(c.data, r.data, *reinterpret_cast<__m128(*)[4]>(&m[0].data)); return m; } }//namespace glm #endif