|
|
@@ -26,7 +26,14 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD::size_type fmat4x4SIMD::row_size()
|
|
|
}
|
|
|
|
|
|
GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD()
|
|
|
-{}
|
|
|
+{
|
|
|
+#ifndef GLM_SIMD_ENABLE_DEFAULT_INIT
|
|
|
+ this->Data[0] = fvec4SIMD(1.0f, 0, 0, 0);
|
|
|
+ this->Data[1] = fvec4SIMD(0, 1.0f, 0, 0);
|
|
|
+ this->Data[2] = fvec4SIMD(0, 0, 1.0f, 0);
|
|
|
+ this->Data[3] = fvec4SIMD(0, 0, 0, 1.0f);
|
|
|
+#endif
|
|
|
+}
|
|
|
|
|
|
GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD(float const & s)
|
|
|
{
|
|
|
@@ -75,6 +82,17 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD
|
|
|
this->Data[3] = fvec4SIMD(m[3]);
|
|
|
}
|
|
|
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD
|
|
|
+(
|
|
|
+ __m128 const in[4]
|
|
|
+)
|
|
|
+{
|
|
|
+ this->Data[0] = in[0];
|
|
|
+ this->Data[1] = in[1];
|
|
|
+ this->Data[2] = in[2];
|
|
|
+ this->Data[3] = in[3];
|
|
|
+}
|
|
|
+
|
|
|
//////////////////////////////////////
|
|
|
// Accesses
|
|
|
|
|
|
@@ -232,6 +250,274 @@ GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-- ()
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+//////////////////////////////////////////////////////////////
|
|
|
+// Binary operators
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator+
|
|
|
+(
|
|
|
+ const fmat4x4SIMD &m,
|
|
|
+ float const & s
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ m[0] + s,
|
|
|
+ m[1] + s,
|
|
|
+ m[2] + s,
|
|
|
+ m[3] + s
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator+
|
|
|
+(
|
|
|
+ float const & s,
|
|
|
+ const fmat4x4SIMD &m
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ m[0] + s,
|
|
|
+ m[1] + s,
|
|
|
+ m[2] + s,
|
|
|
+ m[3] + s
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator+
|
|
|
+(
|
|
|
+ const fmat4x4SIMD &m1,
|
|
|
+ const fmat4x4SIMD &m2
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ m1[0] + m2[0],
|
|
|
+ m1[1] + m2[1],
|
|
|
+ m1[2] + m2[2],
|
|
|
+ m1[3] + m2[3]
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator-
|
|
|
+(
|
|
|
+ const fmat4x4SIMD &m,
|
|
|
+ float const & s
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ m[0] - s,
|
|
|
+ m[1] - s,
|
|
|
+ m[2] - s,
|
|
|
+ m[3] - s
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator-
|
|
|
+(
|
|
|
+ float const & s,
|
|
|
+ const fmat4x4SIMD &m
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ s - m[0],
|
|
|
+ s - m[1],
|
|
|
+ s - m[2],
|
|
|
+ s - m[3]
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator-
|
|
|
+(
|
|
|
+ const fmat4x4SIMD &m1,
|
|
|
+ const fmat4x4SIMD &m2
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ m1[0] - m2[0],
|
|
|
+ m1[1] - m2[1],
|
|
|
+ m1[2] - m2[2],
|
|
|
+ m1[3] - m2[3]
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator*
|
|
|
+(
|
|
|
+ const fmat4x4SIMD &m,
|
|
|
+ float const & s
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ m[0] * s,
|
|
|
+ m[1] * s,
|
|
|
+ m[2] * s,
|
|
|
+ m[3] * s
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator*
|
|
|
+(
|
|
|
+ float const & s,
|
|
|
+ const fmat4x4SIMD &m
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ m[0] * s,
|
|
|
+ m[1] * s,
|
|
|
+ m[2] * s,
|
|
|
+ m[3] * s
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fvec4SIMD operator*
|
|
|
+(
|
|
|
+ const fmat4x4SIMD &m,
|
|
|
+ fvec4SIMD const & v
|
|
|
+)
|
|
|
+{
|
|
|
+ return sse_mul_ps(&m.Data[0].Data, v.Data);
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fvec4SIMD operator*
|
|
|
+(
|
|
|
+ fvec4SIMD const & v,
|
|
|
+ const fmat4x4SIMD &m
|
|
|
+)
|
|
|
+{
|
|
|
+ return sse_mul_ps(v.Data, &m.Data[0].Data);
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator*
|
|
|
+(
|
|
|
+ const fmat4x4SIMD &m1,
|
|
|
+ const fmat4x4SIMD &m2
|
|
|
+)
|
|
|
+{
|
|
|
+ fmat4x4SIMD result;
|
|
|
+ sse_mul_ps(&m1.Data[0].Data, &m2.Data[0].Data, &result.Data[0].Data);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator/
|
|
|
+(
|
|
|
+ const fmat4x4SIMD &m,
|
|
|
+ float const & s
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ m[0] / s,
|
|
|
+ m[1] / s,
|
|
|
+ m[2] / s,
|
|
|
+ m[3] / s
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator/
|
|
|
+(
|
|
|
+ float const & s,
|
|
|
+ const fmat4x4SIMD &m
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ s / m[0],
|
|
|
+ s / m[1],
|
|
|
+ s / m[2],
|
|
|
+ s / m[3]
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fvec4SIMD operator/
|
|
|
+(
|
|
|
+ const fmat4x4SIMD &m,
|
|
|
+ fvec4SIMD const & v
|
|
|
+)
|
|
|
+{
|
|
|
+ return inverse(m) * v;
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fvec4SIMD operator/
|
|
|
+(
|
|
|
+ fvec4SIMD const & v,
|
|
|
+ const fmat4x4SIMD &m
|
|
|
+)
|
|
|
+{
|
|
|
+ return v * inverse(m);
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD operator/
|
|
|
+(
|
|
|
+ const fmat4x4SIMD &m1,
|
|
|
+ const fmat4x4SIMD &m2
|
|
|
+)
|
|
|
+{
|
|
|
+ __m128 result[4];
|
|
|
+ __m128 inv[4];
|
|
|
+
|
|
|
+ sse_inverse_ps(&m2.Data[0].Data, inv);
|
|
|
+ sse_mul_ps(&m1.Data[0].Data, inv, result);
|
|
|
+
|
|
|
+ return fmat4x4SIMD(result);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//////////////////////////////////////////////////////////////
|
|
|
+// Unary constant operators
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD const operator-
|
|
|
+(
|
|
|
+ fmat4x4SIMD const & m
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ -m[0],
|
|
|
+ -m[1],
|
|
|
+ -m[2],
|
|
|
+ -m[3]
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD const operator--
|
|
|
+(
|
|
|
+ fmat4x4SIMD const & m,
|
|
|
+ int
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ m[0] - 1.0f,
|
|
|
+ m[1] - 1.0f,
|
|
|
+ m[2] - 1.0f,
|
|
|
+ m[3] - 1.0f
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+GLM_FUNC_QUALIFIER fmat4x4SIMD const operator++
|
|
|
+(
|
|
|
+ fmat4x4SIMD const & m,
|
|
|
+ int
|
|
|
+)
|
|
|
+{
|
|
|
+ return detail::fmat4x4SIMD
|
|
|
+ (
|
|
|
+ m[0] + 1.0f,
|
|
|
+ m[1] + 1.0f,
|
|
|
+ m[2] + 1.0f,
|
|
|
+ m[3] + 1.0f
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
}//namespace detail
|
|
|
|
|
|
GLM_FUNC_QUALIFIER detail::tmat4x4<float> mat4_cast
|