|
@@ -214,37 +214,23 @@ GLM_FUNC_QUALIFIER quat quat_cast
|
|
|
{
|
|
{
|
|
|
GLM_ALIGN(16) quat Result;
|
|
GLM_ALIGN(16) quat Result;
|
|
|
_mm_store_ps(&Result[0], x.Data);
|
|
_mm_store_ps(&Result[0], x.Data);
|
|
|
|
|
+
|
|
|
return Result;
|
|
return Result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast
|
|
|
|
|
-(
|
|
|
|
|
- detail::fmat4x4SIMD const & m
|
|
|
|
|
-)
|
|
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast_impl(const T m0[], const T m1[], const T m2[])
|
|
|
{
|
|
{
|
|
|
- // Scalar implementation for now.
|
|
|
|
|
-
|
|
|
|
|
- GLM_ALIGN(16) float m0[4];
|
|
|
|
|
- GLM_ALIGN(16) float m1[4];
|
|
|
|
|
- GLM_ALIGN(16) float m2[4];
|
|
|
|
|
- GLM_ALIGN(16) float m3[4];
|
|
|
|
|
-
|
|
|
|
|
- _mm_store_ps(m0, m[0].Data);
|
|
|
|
|
- _mm_store_ps(m1, m[1].Data);
|
|
|
|
|
- _mm_store_ps(m2, m[2].Data);
|
|
|
|
|
- _mm_store_ps(m3, m[3].Data);
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- float trace = m0[0] + m1[1] + m2[2] + 1.0f;
|
|
|
|
|
- if (trace > 0)
|
|
|
|
|
|
|
+ T trace = m0[0] + m1[1] + m2[2] + T(1.0);
|
|
|
|
|
+ if (trace > T(0))
|
|
|
{
|
|
{
|
|
|
- float s = 0.5f / sqrt(trace);
|
|
|
|
|
|
|
+ T s = T(0.5) / sqrt(trace);
|
|
|
|
|
|
|
|
return _mm_set_ps(
|
|
return _mm_set_ps(
|
|
|
- 0.25f / s,
|
|
|
|
|
- (m0[1] - m1[0]) * s,
|
|
|
|
|
- (m2[0] - m0[2]) * s,
|
|
|
|
|
- (m1[2] - m2[1]) * s);
|
|
|
|
|
|
|
+ static_cast<float>(T(0.25) / s),
|
|
|
|
|
+ static_cast<float>((m0[1] - m1[0]) * s),
|
|
|
|
|
+ static_cast<float>((m2[0] - m0[2]) * s),
|
|
|
|
|
+ static_cast<float>((m1[2] - m2[1]) * s));
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
@@ -253,13 +239,13 @@ GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast
|
|
|
if (m0[0] > m2[2])
|
|
if (m0[0] > m2[2])
|
|
|
{
|
|
{
|
|
|
// X is biggest.
|
|
// X is biggest.
|
|
|
- float s = sqrt(m0[0] - m1[1] - m2[2] + 1.0f) * 0.5f;
|
|
|
|
|
|
|
+ T s = sqrt(m0[0] - m1[1] - m2[2] + T(1.0)) * T(0.5);
|
|
|
|
|
|
|
|
return _mm_set_ps(
|
|
return _mm_set_ps(
|
|
|
- (m1[2] - m2[1]) * s,
|
|
|
|
|
- (m2[0] + m0[2]) * s,
|
|
|
|
|
- (m0[1] + m1[0]) * s,
|
|
|
|
|
- 0.5f * s);
|
|
|
|
|
|
|
+ static_cast<float>((m1[2] - m2[1]) * s),
|
|
|
|
|
+ static_cast<float>((m2[0] + m0[2]) * s),
|
|
|
|
|
+ static_cast<float>((m0[1] + m1[0]) * s),
|
|
|
|
|
+ static_cast<float>(T(0.5) * s));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
@@ -267,27 +253,62 @@ GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast
|
|
|
if (m1[1] > m2[2])
|
|
if (m1[1] > m2[2])
|
|
|
{
|
|
{
|
|
|
// Y is biggest.
|
|
// Y is biggest.
|
|
|
- float s = sqrt(m1[1] - m0[0] - m2[2] + 1.0f) * 0.5f;
|
|
|
|
|
|
|
+ T s = sqrt(m1[1] - m0[0] - m2[2] + T(1.0)) * T(0.5);
|
|
|
|
|
|
|
|
return _mm_set_ps(
|
|
return _mm_set_ps(
|
|
|
- (m2[0] - m0[2]) * s,
|
|
|
|
|
- (m1[2] + m2[1]) * s,
|
|
|
|
|
- 0.5f * s,
|
|
|
|
|
- (m0[1] + m1[0]) * s);
|
|
|
|
|
|
|
+ static_cast<float>((m2[0] - m0[2]) * s),
|
|
|
|
|
+ static_cast<float>((m1[2] + m2[1]) * s),
|
|
|
|
|
+ static_cast<float>(T(0.5) * s),
|
|
|
|
|
+ static_cast<float>((m0[1] + m1[0]) * s));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Z is biggest.
|
|
// Z is biggest.
|
|
|
- float s = sqrt(m2[2] - m0[0] - m1[1] + 1.0f) * 0.5f;
|
|
|
|
|
|
|
+ T s = sqrt(m2[2] - m0[0] - m1[1] + T(1.0)) * T(0.5);
|
|
|
|
|
|
|
|
return _mm_set_ps(
|
|
return _mm_set_ps(
|
|
|
- (m0[1] - m1[0]) * s,
|
|
|
|
|
- 0.5f * s,
|
|
|
|
|
- (m1[2] + m2[1]) * s,
|
|
|
|
|
- (m2[0] + m0[2]) * s);
|
|
|
|
|
|
|
+ static_cast<float>((m0[1] - m1[0]) * s),
|
|
|
|
|
+ static_cast<float>(T(0.5) * s),
|
|
|
|
|
+ static_cast<float>((m1[2] + m2[1]) * s),
|
|
|
|
|
+ static_cast<float>((m2[0] + m0[2]) * s));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast
|
|
|
|
|
+(
|
|
|
|
|
+ detail::fmat4x4SIMD const & m
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ // Scalar implementation for now.
|
|
|
|
|
+ GLM_ALIGN(16) float m0[4];
|
|
|
|
|
+ GLM_ALIGN(16) float m1[4];
|
|
|
|
|
+ GLM_ALIGN(16) float m2[4];
|
|
|
|
|
+
|
|
|
|
|
+ _mm_store_ps(m0, m[0].Data);
|
|
|
|
|
+ _mm_store_ps(m1, m[1].Data);
|
|
|
|
|
+ _mm_store_ps(m2, m[2].Data);
|
|
|
|
|
+
|
|
|
|
|
+ return quatSIMD_cast_impl(m0, m1, m2);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T, precision P>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast
|
|
|
|
|
+(
|
|
|
|
|
+ detail::tmat4x4<T, P> const & m
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ return quatSIMD_cast_impl(&m[0][0], &m[1][0], &m[2][0]);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T, precision P>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::fquatSIMD quatSIMD_cast
|
|
|
|
|
+(
|
|
|
|
|
+ detail::tmat3x3<T, P> const & m
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ return quatSIMD_cast_impl(&m[0][0], &m[1][0], &m[2][0]);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
|
|
|
GLM_FUNC_QUALIFIER detail::fmat4x4SIMD mat4SIMD_cast
|
|
GLM_FUNC_QUALIFIER detail::fmat4x4SIMD mat4SIMD_cast
|
|
|
(
|
|
(
|