simd_vec4.hpp
Go to the documentation of this file.
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 #ifndef GLM_GTX_simd_vec4
39 #define GLM_GTX_simd_vec4 GLM_VERSION
40 
41 // Dependency:
42 #include "../glm.hpp"
43 
44 #if(GLM_ARCH != GLM_ARCH_PURE)
45 
46 #if(GLM_ARCH & GLM_ARCH_SSE2)
47 # include "../core/intrinsic_common.hpp"
48 # include "../core/intrinsic_geometric.hpp"
49 #else
50 # error "GLM: GLM_GTX_simd_vec4 requires compiler support of SSE2 through intrinsics"
51 #endif
52 
53 #if(defined(GLM_MESSAGES) && !defined(glm_ext))
54 # pragma message("GLM: GLM_GTX_simd_vec4 extension included")
55 #endif
56 
57 namespace glm{
58 namespace detail
59 {
62  GLM_ALIGNED_STRUCT(16) fvec4SIMD
63  {
64  enum ctor{null};
65  typedef __m128 value_type;
66  typedef std::size_t size_type;
67  static size_type value_size();
68 
69  typedef fvec4SIMD type;
70  typedef tvec4<bool> bool_type;
71 
72  __m128 Data;
73 
75  // Implicit basic constructors
76 
77  fvec4SIMD();
78  fvec4SIMD(__m128 const & Data);
79  fvec4SIMD(fvec4SIMD const & v);
80 
82  // Explicit basic constructors
83 
84  explicit fvec4SIMD(
85  ctor);
86  explicit fvec4SIMD(
87  float const & s);
88  explicit fvec4SIMD(
89  float const & x,
90  float const & y,
91  float const & z,
92  float const & w);
93  explicit fvec4SIMD(
94  tvec4<float> const & v);
95 
98 
99  fvec4SIMD(vec2 const & v, float const & s1, float const & s2);
100  fvec4SIMD(float const & s1, vec2 const & v, float const & s2);
101  fvec4SIMD(float const & s1, float const & s2, vec2 const & v);
102  fvec4SIMD(vec3 const & v, float const & s);
103  fvec4SIMD(float const & s, vec3 const & v);
104  fvec4SIMD(vec2 const & v1, vec2 const & v2);
105  //fvec4SIMD(ivec4SIMD const & v);
106 
108  // Unary arithmetic operators
109 
110  fvec4SIMD& operator= (fvec4SIMD const & v);
111  fvec4SIMD& operator+=(fvec4SIMD const & v);
112  fvec4SIMD& operator-=(fvec4SIMD const & v);
113  fvec4SIMD& operator*=(fvec4SIMD const & v);
114  fvec4SIMD& operator/=(fvec4SIMD const & v);
115 
116  fvec4SIMD& operator+=(float const & s);
117  fvec4SIMD& operator-=(float const & s);
118  fvec4SIMD& operator*=(float const & s);
119  fvec4SIMD& operator/=(float const & s);
120 
121  fvec4SIMD& operator++();
122  fvec4SIMD& operator--();
123 
125  // Swizzle operators
126 
127  template <comp X, comp Y, comp Z, comp W>
128  fvec4SIMD& swizzle();
129  template <comp X, comp Y, comp Z, comp W>
130  fvec4SIMD swizzle() const;
131  template <comp X, comp Y, comp Z>
132  fvec4SIMD swizzle() const;
133  template <comp X, comp Y>
134  fvec4SIMD swizzle() const;
135  template <comp X>
136  fvec4SIMD swizzle() const;
137  };
138 }//namespace detail
139 
140  typedef glm::detail::fvec4SIMD simdVec4;
141 
144 
147  detail::tvec4<float> vec4_cast(
148  detail::fvec4SIMD const & x);
149 
152  detail::fvec4SIMD abs(detail::fvec4SIMD const & x);
153 
156  detail::fvec4SIMD sign(detail::fvec4SIMD const & x);
157 
160  detail::fvec4SIMD floor(detail::fvec4SIMD const & x);
161 
165  detail::fvec4SIMD trunc(detail::fvec4SIMD const & x);
166 
173  detail::fvec4SIMD round(detail::fvec4SIMD const & x);
174 
179  //detail::fvec4SIMD roundEven(detail::fvec4SIMD const & x);
180 
184  detail::fvec4SIMD ceil(detail::fvec4SIMD const & x);
185 
188  detail::fvec4SIMD fract(detail::fvec4SIMD const & x);
189 
193  detail::fvec4SIMD mod(
194  detail::fvec4SIMD const & x,
195  detail::fvec4SIMD const & y);
196 
200  detail::fvec4SIMD mod(
201  detail::fvec4SIMD const & x,
202  float const & y);
203 
209  //detail::fvec4SIMD modf(
210  // detail::fvec4SIMD const & x,
211  // detail::fvec4SIMD & i);
212 
215  detail::fvec4SIMD min(
216  detail::fvec4SIMD const & x,
217  detail::fvec4SIMD const & y);
218 
219  detail::fvec4SIMD min(
220  detail::fvec4SIMD const & x,
221  float const & y);
222 
225  detail::fvec4SIMD max(
226  detail::fvec4SIMD const & x,
227  detail::fvec4SIMD const & y);
228 
229  detail::fvec4SIMD max(
230  detail::fvec4SIMD const & x,
231  float const & y);
232 
236  detail::fvec4SIMD clamp(
237  detail::fvec4SIMD const & x,
238  detail::fvec4SIMD const & minVal,
239  detail::fvec4SIMD const & maxVal);
240 
241  detail::fvec4SIMD clamp(
242  detail::fvec4SIMD const & x,
243  float const & minVal,
244  float const & maxVal);
245 
269  // \todo Test when 'a' is a boolean.
271  detail::fvec4SIMD mix(
272  detail::fvec4SIMD const & x,
273  detail::fvec4SIMD const & y,
274  detail::fvec4SIMD const & a);
275 
278  detail::fvec4SIMD step(
279  detail::fvec4SIMD const & edge,
280  detail::fvec4SIMD const & x);
281 
282  detail::fvec4SIMD step(
283  float const & edge,
284  detail::fvec4SIMD const & x);
285 
296  detail::fvec4SIMD smoothstep(
297  detail::fvec4SIMD const & edge0,
298  detail::fvec4SIMD const & edge1,
299  detail::fvec4SIMD const & x);
300 
301  detail::fvec4SIMD smoothstep(
302  float const & edge0,
303  float const & edge1,
304  detail::fvec4SIMD const & x);
305 
312  //bvec4 isnan(detail::fvec4SIMD const & x);
313 
320  //bvec4 isinf(detail::fvec4SIMD const & x);
321 
326  //detail::ivec4SIMD floatBitsToInt(detail::fvec4SIMD const & value);
327 
334  //detail::fvec4SIMD intBitsToFloat(detail::ivec4SIMD const & value);
335 
338  detail::fvec4SIMD fma(
339  detail::fvec4SIMD const & a,
340  detail::fvec4SIMD const & b,
341  detail::fvec4SIMD const & c);
342 
352  //detail::fvec4SIMD frexp(detail::fvec4SIMD const & x, detail::ivec4SIMD & exp);
353 
360  //detail::fvec4SIMD ldexp(detail::fvec4SIMD const & x, detail::ivec4SIMD const & exp);
361 
364  float length(
365  detail::fvec4SIMD const & x);
366 
370  float fastLength(
371  detail::fvec4SIMD const & x);
372 
376  float niceLength(
377  detail::fvec4SIMD const & x);
378 
381  detail::fvec4SIMD length4(
382  detail::fvec4SIMD const & x);
383 
387  detail::fvec4SIMD fastLength4(
388  detail::fvec4SIMD const & x);
389 
393  detail::fvec4SIMD niceLength4(
394  detail::fvec4SIMD const & x);
395 
398  float distance(
399  detail::fvec4SIMD const & p0,
400  detail::fvec4SIMD const & p1);
401 
404  detail::fvec4SIMD distance4(
405  detail::fvec4SIMD const & p0,
406  detail::fvec4SIMD const & p1);
407 
410  float simdDot(
411  detail::fvec4SIMD const & x,
412  detail::fvec4SIMD const & y);
413 
416  detail::fvec4SIMD dot4(
417  detail::fvec4SIMD const & x,
418  detail::fvec4SIMD const & y);
419 
422  detail::fvec4SIMD cross(
423  detail::fvec4SIMD const & x,
424  detail::fvec4SIMD const & y);
425 
428  detail::fvec4SIMD normalize(
429  detail::fvec4SIMD const & x);
430 
434  detail::fvec4SIMD fastNormalize(
435  detail::fvec4SIMD const & x);
436 
439  detail::fvec4SIMD simdFaceforward(
440  detail::fvec4SIMD const & N,
441  detail::fvec4SIMD const & I,
442  detail::fvec4SIMD const & Nref);
443 
447  detail::fvec4SIMD reflect(
448  detail::fvec4SIMD const & I,
449  detail::fvec4SIMD const & N);
450 
455  detail::fvec4SIMD refract(
456  detail::fvec4SIMD const & I,
457  detail::fvec4SIMD const & N,
458  float const & eta);
459 
462  detail::fvec4SIMD sqrt(
463  detail::fvec4SIMD const & x);
464 
468  detail::fvec4SIMD niceSqrt(
469  detail::fvec4SIMD const & x);
470 
474  detail::fvec4SIMD fastSqrt(
475  detail::fvec4SIMD const & x);
476 
479  detail::fvec4SIMD inversesqrt(
480  detail::fvec4SIMD const & x);
481 
485  detail::fvec4SIMD fastInversesqrt(
486  detail::fvec4SIMD const & x);
487 
489 }//namespace glm
490 
491 #include "simd_vec4.inl"
492 
493 #endif//(GLM_ARCH != GLM_ARCH_PURE)
494 
495 #endif//GLM_GTX_simd_vec4