2.5 KB、99行 生 Blame 履歴
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<qualifier Q>
12 struct compute_length<4, float, Q, true>
13 {
14 GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& v)
15 {
16 return _mm_cvtss_f32(glm_vec4_length(v.data));
17 }
18 };
19
20 template<qualifier Q>
21 struct compute_distance<4, float, Q, true>
22 {
23 GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& p0, vec<4, float, Q> const& p1)
24 {
25 return _mm_cvtss_f32(glm_vec4_distance(p0.data, p1.data));
26 }
27 };
28
29 template<qualifier Q>
30 struct compute_dot<vec<4, float, Q>, float, true>
31 {
32 GLM_FUNC_QUALIFIER static float call(vec<4, float, Q> const& x, vec<4, float, Q> const& y)
33 {
34 return _mm_cvtss_f32(glm_vec1_dot(x.data, y.data));
35 }
36 };
37
38 template<qualifier Q>
39 struct compute_cross<float, Q, true>
40 {
41 GLM_FUNC_QUALIFIER static vec<3, float, Q> call(vec<3, float, Q> const& a, vec<3, float, Q> 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 vec<4, float, Q> Result;
48 Result.data = xpd0;
49 return vec<3, float, Q>(Result);
50 }
51 };
52
53 template<qualifier Q>
54 struct compute_normalize<4, float, Q, true>
55 {
56 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)
57 {
58 vec<4, float, Q> Result;
59 Result.data = glm_vec4_normalize(v.data);
60 return Result;
61 }
62 };
63
64 template<qualifier Q>
65 struct compute_faceforward<4, float, Q, true>
66 {
67 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& N, vec<4, float, Q> const& I, vec<4, float, Q> const& Nref)
68 {
69 vec<4, float, Q> Result;
70 Result.data = glm_vec4_faceforward(N.data, I.data, Nref.data);
71 return Result;
72 }
73 };
74
75 template<qualifier Q>
76 struct compute_reflect<4, float, Q, true>
77 {
78 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& I, vec<4, float, Q> const& N)
79 {
80 vec<4, float, Q> Result;
81 Result.data = glm_vec4_reflect(I.data, N.data);
82 return Result;
83 }
84 };
85
86 template<qualifier Q>
87 struct compute_refract<4, float, Q, true>
88 {
89 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& I, vec<4, float, Q> const& N, float eta)
90 {
91 vec<4, float, Q> Result;
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