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 
58 // Warning silencer for nameless struct/union.
59 #if (GLM_COMPILER & GLM_COMPILER_VC)
60 # pragma warning(push)
61 # pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union
62 #endif
63 
64 
65 namespace glm{
66 namespace detail
67 {
70  GLM_ALIGNED_STRUCT(16) fvec4SIMD
71  {
72  enum ctor{null};
73  typedef __m128 value_type;
74  typedef std::size_t size_type;
75  static size_type value_size();
76 
77  typedef fvec4SIMD type;
78  typedef tvec4<bool> bool_type;
79 
80 #ifdef GLM_SIMD_ENABLE_XYZW_UNION
81  union
82  {
83  __m128 Data;
84  struct {float x, y, z, w;};
85  };
86 #else
87  __m128 Data;
88 #endif
89 
91  // Implicit basic constructors
92 
93  fvec4SIMD();
94  fvec4SIMD(__m128 const & Data);
95  fvec4SIMD(fvec4SIMD const & v);
96 
98  // Explicit basic constructors
99 
100  explicit fvec4SIMD(
101  ctor);
102  explicit fvec4SIMD(
103  float const & s);
104  explicit fvec4SIMD(
105  float const & x,
106  float const & y,
107  float const & z,
108  float const & w);
109  explicit fvec4SIMD(
110  tvec4<float> const & v);
111 
114 
115  fvec4SIMD(vec2 const & v, float const & s1, float const & s2);
116  fvec4SIMD(float const & s1, vec2 const & v, float const & s2);
117  fvec4SIMD(float const & s1, float const & s2, vec2 const & v);
118  fvec4SIMD(vec3 const & v, float const & s);
119  fvec4SIMD(float const & s, vec3 const & v);
120  fvec4SIMD(vec2 const & v1, vec2 const & v2);
121  //fvec4SIMD(ivec4SIMD const & v);
122 
124  // Unary arithmetic operators
125 
126  fvec4SIMD& operator= (fvec4SIMD const & v);
127  fvec4SIMD& operator+=(fvec4SIMD const & v);
128  fvec4SIMD& operator-=(fvec4SIMD const & v);
129  fvec4SIMD& operator*=(fvec4SIMD const & v);
130  fvec4SIMD& operator/=(fvec4SIMD const & v);
131 
132  fvec4SIMD& operator+=(float const & s);
133  fvec4SIMD& operator-=(float const & s);
134  fvec4SIMD& operator*=(float const & s);
135  fvec4SIMD& operator/=(float const & s);
136 
137  fvec4SIMD& operator++();
138  fvec4SIMD& operator--();
139 
141  // Swizzle operators
142 
143  template <comp X, comp Y, comp Z, comp W>
144  fvec4SIMD& swizzle();
145  template <comp X, comp Y, comp Z, comp W>
146  fvec4SIMD swizzle() const;
147  template <comp X, comp Y, comp Z>
148  fvec4SIMD swizzle() const;
149  template <comp X, comp Y>
150  fvec4SIMD swizzle() const;
151  template <comp X>
152  fvec4SIMD swizzle() const;
153  };
154 }//namespace detail
155 
156  typedef glm::detail::fvec4SIMD simdVec4;
157 
160 
163  detail::tvec4<float> vec4_cast(
164  detail::fvec4SIMD const & x);
165 
168  detail::fvec4SIMD abs(detail::fvec4SIMD const & x);
169 
172  detail::fvec4SIMD sign(detail::fvec4SIMD const & x);
173 
176  detail::fvec4SIMD floor(detail::fvec4SIMD const & x);
177 
181  detail::fvec4SIMD trunc(detail::fvec4SIMD const & x);
182 
189  detail::fvec4SIMD round(detail::fvec4SIMD const & x);
190 
195  //detail::fvec4SIMD roundEven(detail::fvec4SIMD const & x);
196 
200  detail::fvec4SIMD ceil(detail::fvec4SIMD const & x);
201 
204  detail::fvec4SIMD fract(detail::fvec4SIMD const & x);
205 
209  detail::fvec4SIMD mod(
210  detail::fvec4SIMD const & x,
211  detail::fvec4SIMD const & y);
212 
216  detail::fvec4SIMD mod(
217  detail::fvec4SIMD const & x,
218  float const & y);
219 
225  //detail::fvec4SIMD modf(
226  // detail::fvec4SIMD const & x,
227  // detail::fvec4SIMD & i);
228 
231  detail::fvec4SIMD min(
232  detail::fvec4SIMD const & x,
233  detail::fvec4SIMD const & y);
234 
235  detail::fvec4SIMD min(
236  detail::fvec4SIMD const & x,
237  float const & y);
238 
241  detail::fvec4SIMD max(
242  detail::fvec4SIMD const & x,
243  detail::fvec4SIMD const & y);
244 
245  detail::fvec4SIMD max(
246  detail::fvec4SIMD const & x,
247  float const & y);
248 
252  detail::fvec4SIMD clamp(
253  detail::fvec4SIMD const & x,
254  detail::fvec4SIMD const & minVal,
255  detail::fvec4SIMD const & maxVal);
256 
257  detail::fvec4SIMD clamp(
258  detail::fvec4SIMD const & x,
259  float const & minVal,
260  float const & maxVal);
261 
285  // \todo Test when 'a' is a boolean.
287  detail::fvec4SIMD mix(
288  detail::fvec4SIMD const & x,
289  detail::fvec4SIMD const & y,
290  detail::fvec4SIMD const & a);
291 
294  detail::fvec4SIMD step(
295  detail::fvec4SIMD const & edge,
296  detail::fvec4SIMD const & x);
297 
298  detail::fvec4SIMD step(
299  float const & edge,
300  detail::fvec4SIMD const & x);
301 
312  detail::fvec4SIMD smoothstep(
313  detail::fvec4SIMD const & edge0,
314  detail::fvec4SIMD const & edge1,
315  detail::fvec4SIMD const & x);
316 
317  detail::fvec4SIMD smoothstep(
318  float const & edge0,
319  float const & edge1,
320  detail::fvec4SIMD const & x);
321 
328  //bvec4 isnan(detail::fvec4SIMD const & x);
329 
336  //bvec4 isinf(detail::fvec4SIMD const & x);
337 
342  //detail::ivec4SIMD floatBitsToInt(detail::fvec4SIMD const & value);
343 
350  //detail::fvec4SIMD intBitsToFloat(detail::ivec4SIMD const & value);
351 
354  detail::fvec4SIMD fma(
355  detail::fvec4SIMD const & a,
356  detail::fvec4SIMD const & b,
357  detail::fvec4SIMD const & c);
358 
368  //detail::fvec4SIMD frexp(detail::fvec4SIMD const & x, detail::ivec4SIMD & exp);
369 
376  //detail::fvec4SIMD ldexp(detail::fvec4SIMD const & x, detail::ivec4SIMD const & exp);
377 
380  float length(
381  detail::fvec4SIMD const & x);
382 
386  float fastLength(
387  detail::fvec4SIMD const & x);
388 
392  float niceLength(
393  detail::fvec4SIMD const & x);
394 
397  detail::fvec4SIMD length4(
398  detail::fvec4SIMD const & x);
399 
403  detail::fvec4SIMD fastLength4(
404  detail::fvec4SIMD const & x);
405 
409  detail::fvec4SIMD niceLength4(
410  detail::fvec4SIMD const & x);
411 
414  float distance(
415  detail::fvec4SIMD const & p0,
416  detail::fvec4SIMD const & p1);
417 
420  detail::fvec4SIMD distance4(
421  detail::fvec4SIMD const & p0,
422  detail::fvec4SIMD const & p1);
423 
426  float simdDot(
427  detail::fvec4SIMD const & x,
428  detail::fvec4SIMD const & y);
429 
432  detail::fvec4SIMD dot4(
433  detail::fvec4SIMD const & x,
434  detail::fvec4SIMD const & y);
435 
438  detail::fvec4SIMD cross(
439  detail::fvec4SIMD const & x,
440  detail::fvec4SIMD const & y);
441 
444  detail::fvec4SIMD normalize(
445  detail::fvec4SIMD const & x);
446 
450  detail::fvec4SIMD fastNormalize(
451  detail::fvec4SIMD const & x);
452 
455  detail::fvec4SIMD simdFaceforward(
456  detail::fvec4SIMD const & N,
457  detail::fvec4SIMD const & I,
458  detail::fvec4SIMD const & Nref);
459 
463  detail::fvec4SIMD reflect(
464  detail::fvec4SIMD const & I,
465  detail::fvec4SIMD const & N);
466 
471  detail::fvec4SIMD refract(
472  detail::fvec4SIMD const & I,
473  detail::fvec4SIMD const & N,
474  float const & eta);
475 
478  detail::fvec4SIMD sqrt(
479  detail::fvec4SIMD const & x);
480 
484  detail::fvec4SIMD niceSqrt(
485  detail::fvec4SIMD const & x);
486 
490  detail::fvec4SIMD fastSqrt(
491  detail::fvec4SIMD const & x);
492 
495  detail::fvec4SIMD inversesqrt(
496  detail::fvec4SIMD const & x);
497 
501  detail::fvec4SIMD fastInversesqrt(
502  detail::fvec4SIMD const & x);
503 
505 }//namespace glm
506 
507 #include "simd_vec4.inl"
508 
509 
510 #if (GLM_COMPILER & GLM_COMPILER_VC)
511 # pragma warning(pop)
512 #endif
513 
514 
515 #endif//(GLM_ARCH != GLM_ARCH_PURE)
516 
517 #endif//GLM_GTX_simd_vec4