1/// @ref core 2/// @file glm/detail/func_geometric_simd.inl 3 4#include "../simd/geometric.h" 5 6#if GLM_ARCH & GLM_ARCH_SSE2_BIT 7 8namespace glm{ 9namespace detail 10{ 11 template <precision P> 12 struct compute_length<tvec4, float, P, true> 13 { 14 GLM_FUNC_QUALIFIER static float call(tvec4<float, P> const & v) 15 { 16 return _mm_cvtss_f32(glm_vec4_length(v.data)); 17 } 18 }; 19 20 template <precision P> 21 struct compute_distance<tvec4, float, P, true> 22 { 23 GLM_FUNC_QUALIFIER static float call(tvec4<float, P> const & p0, tvec4<float, P> const & p1) 24 { 25 return _mm_cvtss_f32(glm_vec4_distance(p0.data, p1.data)); 26 } 27 }; 28 29 template <precision P> 30 struct compute_dot<tvec4, float, P, true> 31 { 32 GLM_FUNC_QUALIFIER static float call(tvec4<float, P> const& x, tvec4<float, P> const& y) 33 { 34 return _mm_cvtss_f32(glm_vec1_dot(x.data, y.data)); 35 } 36 }; 37 38 template <precision P> 39 struct compute_cross<float, P, true> 40 { 41 GLM_FUNC_QUALIFIER static tvec3<float, P> call(tvec3<float, P> const & a, tvec3<float, P> const & b) 42 { 43 __m128 const set0 = _mm_set_ps(0.0f, a.z, a.y, a.x); 44 __m128 const set1 = _mm_set_ps(0.0f, b.z, b.y, b.x); 45 __m128 const xpd0 = glm_vec4_cross(set0, set1); 46 47 tvec4<float, P> result(uninitialize); 48 result.data = xpd0; 49 return tvec3<float, P>(result); 50 } 51 }; 52 53 template <precision P> 54 struct compute_normalize<float, P, tvec4, true> 55 { 56 GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const & v) 57 { 58 tvec4<float, P> result(uninitialize); 59 result.data = glm_vec4_normalize(v.data); 60 return result; 61 } 62 }; 63 64 template <precision P> 65 struct compute_faceforward<float, P, tvec4, true> 66 { 67 GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& N, tvec4<float, P> const& I, tvec4<float, P> const& Nref) 68 { 69 tvec4<float, P> result(uninitialize); 70 result.data = glm_vec4_faceforward(N.data, I.data, Nref.data); 71 return result; 72 } 73 }; 74 75 template <precision P> 76 struct compute_reflect<float, P, tvec4, true> 77 { 78 GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& I, tvec4<float, P> const& N) 79 { 80 tvec4<float, P> result(uninitialize); 81 result.data = glm_vec4_reflect(I.data, N.data); 82 return result; 83 } 84 }; 85 86 template <precision P> 87 struct compute_refract<float, P, tvec4, true> 88 { 89 GLM_FUNC_QUALIFIER static tvec4<float, P> call(tvec4<float, P> const& I, tvec4<float, P> const& N, float eta) 90 { 91 tvec4<float, P> result(uninitialize); 92 result.data = glm_vec4_refract(I.data, N.data, _mm_set1_ps(eta)); 93 return result; 94 } 95 }; 96}//namespace detail 97}//namespace glm 98 99#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT 100