0.9.6
type_vec4.hpp
Go to the documentation of this file.
1 
29 #pragma once
30 
31 //#include "../fwd.hpp"
32 #include "setup.hpp"
33 #include "type_vec.hpp"
34 #ifdef GLM_SWIZZLE
35 # if GLM_HAS_ANONYMOUS_UNION
36 # include "_swizzle.hpp"
37 # else
38 # include "_swizzle_func.hpp"
39 # endif
40 #endif //GLM_SWIZZLE
41 #include <cstddef>
42 
43 namespace glm{
44 namespace detail
45 {
46  template <typename T>
47  struct simd
48  {
49  typedef T type[4];
50  };
51 
52 # if GLM_ARCH & GLM_ARCH_SSE2
53  template <>
54  struct simd<float>
55  {
56  typedef __m128 type;
57  };
58 
59  template <>
60  struct simd<int>
61  {
62  typedef __m128i type;
63  };
64 
65  template <>
66  struct simd<unsigned int>
67  {
68  typedef __m128i type;
69  };
70 # endif
71 
72 # if GLM_ARCH & GLM_ARCH_AVX
73  template <>
74  struct simd<double>
75  {
76  typedef __m256d type;
77  };
78 # endif
79 
80 # if GLM_ARCH & GLM_ARCH_AVX2
81  template <>
82  struct simd<int64>
83  {
84  typedef __m256i type;
85  };
86 
87  template <>
88  struct simd<uint64>
89  {
90  typedef __m256i type;
91  };
92 # endif
93 
94 }//namespace detail
95 
96  template <typename T, precision P = defaultp>
97  struct tvec4
98  {
100  // Implementation detail
101 
102  typedef tvec4<T, P> type;
103  typedef tvec4<bool, P> bool_type;
104  typedef T value_type;
105  typedef int size_type;
106 
108  // Helper
109 
110 # ifdef GLM_FORCE_SIZE_FUNC
111  GLM_FUNC_DECL GLM_CONSTEXPR size_t size() const;
113 # else
114  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;
116 # endif//GLM_FORCE_SIZE_FUNC
117 
119  // Data
120 
121 # if GLM_HAS_ANONYMOUS_UNION
122  union
123  {
124  typename detail::simd<T>::type data;
125  struct { T r, g, b, a; };
126  struct { T s, t, p, q; };
127  struct { T x, y, z, w;};
128 
129 # ifdef GLM_SWIZZLE
130  _GLM_SWIZZLE4_2_MEMBERS(T, P, tvec2, x, y, z, w)
131  _GLM_SWIZZLE4_2_MEMBERS(T, P, tvec2, r, g, b, a)
132  _GLM_SWIZZLE4_2_MEMBERS(T, P, tvec2, s, t, p, q)
133  _GLM_SWIZZLE4_3_MEMBERS(T, P, tvec3, x, y, z, w)
134  _GLM_SWIZZLE4_3_MEMBERS(T, P, tvec3, r, g, b, a)
135  _GLM_SWIZZLE4_3_MEMBERS(T, P, tvec3, s, t, p, q)
136  _GLM_SWIZZLE4_4_MEMBERS(T, P, tvec4, x, y, z, w)
137  _GLM_SWIZZLE4_4_MEMBERS(T, P, tvec4, r, g, b, a)
138  _GLM_SWIZZLE4_4_MEMBERS(T, P, tvec4, s, t, p, q)
139 # endif//GLM_SWIZZLE
140  };
141 # else
142  union { T x, r, s; };
143  union { T y, g, t; };
144  union { T z, b, p; };
145  union { T w, a, q; };
146 
147 # ifdef GLM_SWIZZLE
148  GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, P, tvec4, tvec2, tvec3, tvec4)
149 # endif//GLM_SWIZZLE
150 # endif//GLM_LANG
151 
153  // Accesses
154 
155  GLM_FUNC_DECL T & operator[](length_t i);
156  GLM_FUNC_DECL T const & operator[](length_t i) const;
157 
159  // Implicit basic constructors
160 
161  GLM_FUNC_DECL tvec4();
162  template <precision Q>
163  GLM_FUNC_DECL tvec4(tvec4<T, Q> const & v);
164 
166  // Explicit basic constructors
167 
168  GLM_FUNC_DECL explicit tvec4(ctor);
169  GLM_FUNC_DECL explicit tvec4(T s);
170  GLM_FUNC_DECL tvec4(T a, T b, T c, T d);
171  GLM_FUNC_DECL ~tvec4(){}
172 
174  // Conversion scalar constructors
175 
177  template <typename A, typename B, typename C, typename D>
178  GLM_FUNC_DECL tvec4(A a, B b, C c, D d);
179  template <typename A, typename B, typename C, typename D>
180  GLM_FUNC_DECL tvec4(tvec1<A, P> const & a, tvec1<B, P> const & b, tvec1<C, P> const & c, tvec1<D, P> const & d);
181 
183  // Conversion vector constructors
184 
186  template <typename A, typename B, typename C, precision Q>
187  GLM_FUNC_DECL explicit tvec4(tvec2<A, Q> const & a, B b, C c);
189  template <typename A, typename B, typename C, precision Q>
190  GLM_FUNC_DECL explicit tvec4(tvec2<A, Q> const & a, tvec1<B, Q> const & b, tvec1<C, Q> const & c);
192  template <typename A, typename B, typename C, precision Q>
193  GLM_FUNC_DECL explicit tvec4(A a, tvec2<B, Q> const & b, C c);
195  template <typename A, typename B, typename C, precision Q>
196  GLM_FUNC_DECL explicit tvec4(tvec1<A, Q> const & a, tvec2<B, Q> const & b, tvec1<C, Q> const & c);
198  template <typename A, typename B, typename C, precision Q>
199  GLM_FUNC_DECL explicit tvec4(A a, B b, tvec2<C, Q> const & c);
201  template <typename A, typename B, typename C, precision Q>
202  GLM_FUNC_DECL explicit tvec4(tvec1<A, Q> const & a, tvec1<B, Q> const & b, tvec2<C, Q> const & c);
204  template <typename A, typename B, precision Q>
205  GLM_FUNC_DECL explicit tvec4(tvec3<A, Q> const & a, B b);
207  template <typename A, typename B, precision Q>
208  GLM_FUNC_DECL explicit tvec4(tvec3<A, Q> const & a, tvec1<B, Q> const & b);
210  template <typename A, typename B, precision Q>
211  GLM_FUNC_DECL explicit tvec4(A a, tvec3<B, Q> const & b);
213  template <typename A, typename B, precision Q>
214  GLM_FUNC_DECL explicit tvec4(tvec1<A, Q> const & a, tvec3<B, Q> const & b);
216  template <typename A, typename B, precision Q>
217  GLM_FUNC_DECL explicit tvec4(tvec2<A, Q> const & a, tvec2<B, Q> const & b);
218 
219 # ifdef GLM_FORCE_EXPLICIT_CTOR
220  template <typename U, precision Q>
222  GLM_FUNC_DECL explicit tvec4(tvec4<U, Q> const & v);
223 # else
224  template <typename U, precision Q>
226  GLM_FUNC_DECL tvec4(tvec4<U, Q> const & v);
227 # endif
228 
230  // Swizzle constructors
231 
232 # if GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE)
233  template <int E0, int E1, int E2, int E3>
234  GLM_FUNC_DECL tvec4(detail::_swizzle<4, T, P, tvec4<T, P>, E0, E1, E2, E3> const & that)
235  {
236  *this = that();
237  }
238 
239  template <int E0, int E1, int F0, int F1>
240  GLM_FUNC_DECL tvec4(detail::_swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const & v, detail::_swizzle<2, T, P, tvec2<T, P>, F0, F1, -1, -2> const & u)
241  {
242  *this = tvec4<T, P>(v(), u());
243  }
244 
245  template <int E0, int E1>
246  GLM_FUNC_DECL tvec4(T const & x, T const & y, detail::_swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const & v)
247  {
248  *this = tvec4<T, P>(x, y, v());
249  }
250 
251  template <int E0, int E1>
252  GLM_FUNC_DECL tvec4(T const & x, detail::_swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const & v, T const & w)
253  {
254  *this = tvec4<T, P>(x, v(), w);
255  }
256 
257  template <int E0, int E1>
258  GLM_FUNC_DECL tvec4(detail::_swizzle<2, T, P, tvec2<T, P>, E0, E1, -1, -2> const & v, T const & z, T const & w)
259  {
260  *this = tvec4<T, P>(v(), z, w);
261  }
262 
263  template <int E0, int E1, int E2>
264  GLM_FUNC_DECL tvec4(detail::_swizzle<3, T, P, tvec3<T, P>, E0, E1, E2, -1> const & v, T const & w)
265  {
266  *this = tvec4<T, P>(v(), w);
267  }
268 
269  template <int E0, int E1, int E2>
270  GLM_FUNC_DECL tvec4(T const & x, detail::_swizzle<3, T, P, tvec3<T, P>, E0, E1, E2, -1> const & v)
271  {
272  *this = tvec4<T, P>(x, v());
273  }
274 # endif// GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE)
275 
277  // Unary arithmetic operators
278 
279  template <typename U>
280  GLM_FUNC_DECL tvec4<T, P> & operator=(tvec4<U, P> const & v);
281  template <typename U>
282  GLM_FUNC_DECL tvec4<T, P> & operator+=(U scalar);
283  template <typename U>
284  GLM_FUNC_DECL tvec4<T, P> & operator+=(tvec1<U, P> const & v);
285  template <typename U>
286  GLM_FUNC_DECL tvec4<T, P> & operator+=(tvec4<U, P> const & v);
287  template <typename U>
288  GLM_FUNC_DECL tvec4<T, P> & operator-=(U scalar);
289  template <typename U>
290  GLM_FUNC_DECL tvec4<T, P> & operator-=(tvec1<U, P> const & v);
291  template <typename U>
292  GLM_FUNC_DECL tvec4<T, P> & operator-=(tvec4<U, P> const & v);
293  template <typename U>
294  GLM_FUNC_DECL tvec4<T, P> & operator*=(U scalar);
295  template <typename U>
296  GLM_FUNC_DECL tvec4<T, P> & operator*=(tvec1<U, P> const & v);
297  template <typename U>
298  GLM_FUNC_DECL tvec4<T, P> & operator*=(tvec4<U, P> const & v);
299  template <typename U>
300  GLM_FUNC_DECL tvec4<T, P> & operator/=(U scalar);
301  template <typename U>
302  GLM_FUNC_DECL tvec4<T, P> & operator/=(tvec1<U, P> const & v);
303  template <typename U>
304  GLM_FUNC_DECL tvec4<T, P> & operator/=(tvec4<U, P> const & v);
305 
307  // Increment and decrement operators
308 
309  GLM_FUNC_DECL tvec4<T, P> & operator++();
310  GLM_FUNC_DECL tvec4<T, P> & operator--();
311  GLM_FUNC_DECL tvec4<T, P> operator++(int);
312  GLM_FUNC_DECL tvec4<T, P> operator--(int);
313 
315  // Unary bit operators
316 
317  template <typename U>
318  GLM_FUNC_DECL tvec4<T, P> & operator%=(U scalar);
319  template <typename U>
320  GLM_FUNC_DECL tvec4<T, P> & operator%=(tvec1<U, P> const & v);
321  template <typename U>
322  GLM_FUNC_DECL tvec4<T, P> & operator%=(tvec4<U, P> const & v);
323  template <typename U>
324  GLM_FUNC_DECL tvec4<T, P> & operator&=(U scalar);
325  template <typename U>
326  GLM_FUNC_DECL tvec4<T, P> & operator&=(tvec1<U, P> const & v);
327  template <typename U>
328  GLM_FUNC_DECL tvec4<T, P> & operator&=(tvec4<U, P> const & v);
329  template <typename U>
330  GLM_FUNC_DECL tvec4<T, P> & operator|=(U scalar);
331  template <typename U>
332  GLM_FUNC_DECL tvec4<T, P> & operator|=(tvec1<U, P> const & v);
333  template <typename U>
334  GLM_FUNC_DECL tvec4<T, P> & operator|=(tvec4<U, P> const & v);
335  template <typename U>
336  GLM_FUNC_DECL tvec4<T, P> & operator^=(U scalar);
337  template <typename U>
338  GLM_FUNC_DECL tvec4<T, P> & operator^=(tvec1<U, P> const & v);
339  template <typename U>
340  GLM_FUNC_DECL tvec4<T, P> & operator^=(tvec4<U, P> const & v);
341  template <typename U>
342  GLM_FUNC_DECL tvec4<T, P> & operator<<=(U scalar);
343  template <typename U>
344  GLM_FUNC_DECL tvec4<T, P> & operator<<=(tvec1<U, P> const & v);
345  template <typename U>
346  GLM_FUNC_DECL tvec4<T, P> & operator<<=(tvec4<U, P> const & v);
347  template <typename U>
348  GLM_FUNC_DECL tvec4<T, P> & operator>>=(U scalar);
349  template <typename U>
350  GLM_FUNC_DECL tvec4<T, P> & operator>>=(tvec1<U, P> const & v);
351  template <typename U>
352  GLM_FUNC_DECL tvec4<T, P> & operator>>=(tvec4<U, P> const & v);
353  };
354 
355  template <typename T, precision P>
356  GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v, T scalar);
357 
358  template <typename T, precision P>
359  GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v, tvec1<T, P> const & s);
360 
361  template <typename T, precision P>
362  GLM_FUNC_DECL tvec4<T, P> operator+(T scalar, tvec4<T, P> const & v);
363 
364  template <typename T, precision P>
365  GLM_FUNC_DECL tvec4<T, P> operator+(tvec1<T, P> const & s, tvec4<T, P> const & v);
366 
367  template <typename T, precision P>
368  GLM_FUNC_DECL tvec4<T, P> operator+(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
369 
370  template <typename T, precision P>
371  GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v, T scalar);
372 
373  template <typename T, precision P>
374  GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v, tvec1<T, P> const & s);
375 
376  template <typename T, precision P>
377  GLM_FUNC_DECL tvec4<T, P> operator-(T scalar, tvec4<T, P> const & v);
378 
379  template <typename T, precision P>
380  GLM_FUNC_DECL tvec4<T, P> operator-(tvec1<T, P> const & s, tvec4<T, P> const & v);
381 
382  template <typename T, precision P>
383  GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
384 
385  template <typename T, precision P>
386  GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v, T scalar);
387 
388  template <typename T, precision P>
389  GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v, tvec1<T, P> const & s);
390 
391  template <typename T, precision P>
392  GLM_FUNC_DECL tvec4<T, P> operator*(T scalar, tvec4<T, P> const & v);
393 
394  template <typename T, precision P>
395  GLM_FUNC_DECL tvec4<T, P> operator*(tvec1<T, P> const & s, tvec4<T, P> const & v);
396 
397  template <typename T, precision P>
398  GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
399 
400  template <typename T, precision P>
401  GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v, T scalar);
402 
403  template <typename T, precision P>
404  GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v, tvec1<T, P> const & s);
405 
406  template <typename T, precision P>
407  GLM_FUNC_DECL tvec4<T, P> operator/(T scalar, tvec4<T, P> const & v);
408 
409  template <typename T, precision P>
410  GLM_FUNC_DECL tvec4<T, P> operator/(tvec1<T, P> const & s, tvec4<T, P> const & v);
411 
412  template <typename T, precision P>
413  GLM_FUNC_DECL tvec4<T, P> operator/(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
414 
415  template <typename T, precision P>
416  GLM_FUNC_DECL tvec4<T, P> operator-(tvec4<T, P> const & v);
417 
418  template <typename T, precision P>
419  GLM_FUNC_DECL bool operator==(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
420 
421  template <typename T, precision P>
422  GLM_FUNC_DECL bool operator!=(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
423 
424  template <typename T, precision P>
425  GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v, T scalar);
426 
427  template <typename T, precision P>
428  GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v, tvec1<T, P> const & s);
429 
430  template <typename T, precision P>
431  GLM_FUNC_DECL tvec4<T, P> operator%(T scalar, tvec4<T, P> const & v);
432 
433  template <typename T, precision P>
434  GLM_FUNC_DECL tvec4<T, P> operator%(tvec1<T, P> const & s, tvec4<T, P> const & v);
435 
436  template <typename T, precision P>
437  GLM_FUNC_DECL tvec4<T, P> operator%(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
438 
439  template <typename T, precision P>
440  GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v, T scalar);
441 
442  template <typename T, precision P>
443  GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v, tvec1<T, P> const & s);
444 
445  template <typename T, precision P>
446  GLM_FUNC_DECL tvec4<T, P> operator&(T scalar, tvec4<T, P> const & v);
447 
448  template <typename T, precision P>
449  GLM_FUNC_DECL tvec4<T, P> operator&(tvec1<T, P> const & s, tvec4<T, P> const & v);
450 
451  template <typename T, precision P>
452  GLM_FUNC_DECL tvec4<T, P> operator&(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
453 
454  template <typename T, precision P>
455  GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v, T scalar);
456 
457  template <typename T, precision P>
458  GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v, tvec1<T, P> const & s);
459 
460  template <typename T, precision P>
461  GLM_FUNC_DECL tvec4<T, P> operator|(T scalar, tvec4<T, P> const & v);
462 
463  template <typename T, precision P>
464  GLM_FUNC_DECL tvec4<T, P> operator|(tvec1<T, P> const & s, tvec4<T, P> const & v);
465 
466  template <typename T, precision P>
467  GLM_FUNC_DECL tvec4<T, P> operator|(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
468 
469  template <typename T, precision P>
470  GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v, T scalar);
471 
472  template <typename T, precision P>
473  GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v, tvec1<T, P> const & s);
474 
475  template <typename T, precision P>
476  GLM_FUNC_DECL tvec4<T, P> operator^(T scalar, tvec4<T, P> const & v);
477 
478  template <typename T, precision P>
479  GLM_FUNC_DECL tvec4<T, P> operator^(tvec1<T, P> const & s, tvec4<T, P> const & v);
480 
481  template <typename T, precision P>
482  GLM_FUNC_DECL tvec4<T, P> operator^(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
483 
484  template <typename T, precision P>
485  GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v, T scalar);
486 
487  template <typename T, precision P>
488  GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v, tvec1<T, P> const & s);
489 
490  template <typename T, precision P>
491  GLM_FUNC_DECL tvec4<T, P> operator<<(T scalar, tvec4<T, P> const & v);
492 
493  template <typename T, precision P>
494  GLM_FUNC_DECL tvec4<T, P> operator<<(tvec1<T, P> const & s, tvec4<T, P> const & v);
495 
496  template <typename T, precision P>
497  GLM_FUNC_DECL tvec4<T, P> operator<<(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
498 
499  template <typename T, precision P>
500  GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v, T scalar);
501 
502  template <typename T, precision P>
503  GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v, tvec1<T, P> const & s);
504 
505  template <typename T, precision P>
506  GLM_FUNC_DECL tvec4<T, P> operator>>(T scalar, tvec4<T, P> const & v);
507 
508  template <typename T, precision P>
509  GLM_FUNC_DECL tvec4<T, P> operator>>(tvec1<T, P> const & s, tvec4<T, P> const & v);
510 
511  template <typename T, precision P>
512  GLM_FUNC_DECL tvec4<T, P> operator>>(tvec4<T, P> const & v1, tvec4<T, P> const & v2);
513 
514  template <typename T, precision P>
515  GLM_FUNC_DECL tvec4<T, P> operator~(tvec4<T, P> const & v);
516 }//namespace glm
517 
518 #ifndef GLM_EXTERNAL_TEMPLATE
519 #include "type_vec4.inl"
520 #endif//GLM_EXTERNAL_TEMPLATE
GLM_FUNC_DECL T length(vecType< T, P > const &x)
Returns the length of x, i.e., sqrt(x * x).
Definition: _noise.hpp:31
OpenGL Mathematics (glm.g-truc.net)
OpenGL Mathematics (glm.g-truc.net)
OpenGL Mathematics (glm.g-truc.net)
OpenGL Mathematics (glm.g-truc.net)