master
ブランチ master
VulkanExample / dep / include / glm / detail / type_vec4.inl
35.8 KB、1108行 生 Blame 履歴
1/// @ref core
2
3#include "compute_vector_relational.hpp"
4#include "compute_vector_decl.hpp"
5
6namespace glm{
7namespace detail
8{
9
10}//namespace detail
11
12 // -- Implicit basic constructors --
13
14# if GLM_CONFIG_CTOR_INIT == GLM_ENABLE
15 template<typename T, qualifier Q>
16 GLM_DEFAULTED_DEFAULT_CTOR_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec()
17 : x(0), y(0), z(0), w(0)
18 {}
19# endif
20
21 template<typename T, qualifier Q>
22 template<qualifier P>
23 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<4, T, P> const& v)
24 : x(v.x), y(v.y), z(v.z), w(v.w)
25 {}
26
27 // -- Explicit basic constructors --
28
29 template<typename T, qualifier Q>
30 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(T scalar)
31 : x(scalar), y(scalar), z(scalar), w(scalar)
32 {}
33
34 template<typename T, qualifier Q>
35 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(T _x, T _y, T _z, T _w)
36 : x(_x), y(_y), z(_z), w(_w)
37 {}
38
39 // -- Conversion scalar constructors --
40
41 template<typename T, qualifier Q>
42 template<typename U, qualifier P>
43 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, U, P> const& v)
44 : x(static_cast<T>(v.x))
45 , y(static_cast<T>(v.x))
46 , z(static_cast<T>(v.x))
47 , w(static_cast<T>(v.x))
48 {}
49
50 template<typename T, qualifier Q>
51 template<typename X, typename Y, typename Z, typename W>
52 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, Y _y, Z _z, W _w)
53 : x(static_cast<T>(_x))
54 , y(static_cast<T>(_y))
55 , z(static_cast<T>(_z))
56 , w(static_cast<T>(_w))
57 {}
58
59 template<typename T, qualifier Q>
60 template<typename X, typename Y, typename Z, typename W>
61 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, Z _z, W _w)
62 : x(static_cast<T>(_x.x))
63 , y(static_cast<T>(_y))
64 , z(static_cast<T>(_z))
65 , w(static_cast<T>(_w))
66 {}
67
68 template<typename T, qualifier Q>
69 template<typename X, typename Y, typename Z, typename W>
70 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, Z _z, W _w)
71 : x(static_cast<T>(_x))
72 , y(static_cast<T>(_y.x))
73 , z(static_cast<T>(_z))
74 , w(static_cast<T>(_w))
75 {}
76
77 template<typename T, qualifier Q>
78 template<typename X, typename Y, typename Z, typename W>
79 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, W _w)
80 : x(static_cast<T>(_x.x))
81 , y(static_cast<T>(_y.x))
82 , z(static_cast<T>(_z))
83 , w(static_cast<T>(_w))
84 {}
85
86 template<typename T, qualifier Q>
87 template<typename X, typename Y, typename Z, typename W>
88 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, Y _y, vec<1, Z, Q> const& _z, W _w)
89 : x(static_cast<T>(_x))
90 , y(static_cast<T>(_y))
91 , z(static_cast<T>(_z.x))
92 , w(static_cast<T>(_w))
93 {}
94
95 template<typename T, qualifier Q>
96 template<typename X, typename Y, typename Z, typename W>
97 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, W _w)
98 : x(static_cast<T>(_x.x))
99 , y(static_cast<T>(_y))
100 , z(static_cast<T>(_z.x))
101 , w(static_cast<T>(_w))
102 {}
103
104 template<typename T, qualifier Q>
105 template<typename X, typename Y, typename Z, typename W>
106 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w)
107 : x(static_cast<T>(_x))
108 , y(static_cast<T>(_y.x))
109 , z(static_cast<T>(_z.x))
110 , w(static_cast<T>(_w))
111 {}
112
113 template<typename T, qualifier Q>
114 template<typename X, typename Y, typename Z, typename W>
115 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w)
116 : x(static_cast<T>(_x.x))
117 , y(static_cast<T>(_y.x))
118 , z(static_cast<T>(_z.x))
119 , w(static_cast<T>(_w))
120 {}
121
122 template<typename T, qualifier Q>
123 template<typename X, typename Y, typename Z, typename W>
124 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, Z _z, vec<1, W, Q> const& _w)
125 : x(static_cast<T>(_x.x))
126 , y(static_cast<T>(_y))
127 , z(static_cast<T>(_z))
128 , w(static_cast<T>(_w.x))
129 {}
130
131 template<typename T, qualifier Q>
132 template<typename X, typename Y, typename Z, typename W>
133 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w)
134 : x(static_cast<T>(_x))
135 , y(static_cast<T>(_y.x))
136 , z(static_cast<T>(_z))
137 , w(static_cast<T>(_w.x))
138 {}
139
140 template<typename T, qualifier Q>
141 template<typename X, typename Y, typename Z, typename W>
142 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w)
143 : x(static_cast<T>(_x.x))
144 , y(static_cast<T>(_y.x))
145 , z(static_cast<T>(_z))
146 , w(static_cast<T>(_w.x))
147 {}
148
149 template<typename T, qualifier Q>
150 template<typename X, typename Y, typename Z, typename W>
151 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w)
152 : x(static_cast<T>(_x))
153 , y(static_cast<T>(_y))
154 , z(static_cast<T>(_z.x))
155 , w(static_cast<T>(_w.x))
156 {}
157
158 template<typename T, qualifier Q>
159 template<typename X, typename Y, typename Z, typename W>
160 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w)
161 : x(static_cast<T>(_x.x))
162 , y(static_cast<T>(_y))
163 , z(static_cast<T>(_z.x))
164 , w(static_cast<T>(_w.x))
165 {}
166
167 template<typename T, qualifier Q>
168 template<typename X, typename Y, typename Z, typename W>
169 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w)
170 : x(static_cast<T>(_x))
171 , y(static_cast<T>(_y.x))
172 , z(static_cast<T>(_z.x))
173 , w(static_cast<T>(_w.x))
174 {}
175
176 template<typename T, qualifier Q>
177 template<typename X, typename Y, typename Z, typename W>
178 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w)
179 : x(static_cast<T>(_x.x))
180 , y(static_cast<T>(_y.x))
181 , z(static_cast<T>(_z.x))
182 , w(static_cast<T>(_w.x))
183 {}
184
185 // -- Conversion vector constructors --
186
187 template<typename T, qualifier Q>
188 template<typename A, typename B, typename C, qualifier P>
189 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, B _z, C _w)
190 : x(static_cast<T>(_xy.x))
191 , y(static_cast<T>(_xy.y))
192 , z(static_cast<T>(_z))
193 , w(static_cast<T>(_w))
194 {}
195
196 template<typename T, qualifier Q>
197 template<typename A, typename B, typename C, qualifier P>
198 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, C _w)
199 : x(static_cast<T>(_xy.x))
200 , y(static_cast<T>(_xy.y))
201 , z(static_cast<T>(_z.x))
202 , w(static_cast<T>(_w))
203 {}
204
205 template<typename T, qualifier Q>
206 template<typename A, typename B, typename C, qualifier P>
207 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, B _z, vec<1, C, P> const& _w)
208 : x(static_cast<T>(_xy.x))
209 , y(static_cast<T>(_xy.y))
210 , z(static_cast<T>(_z))
211 , w(static_cast<T>(_w.x))
212 {}
213
214 template<typename T, qualifier Q>
215 template<typename A, typename B, typename C, qualifier P>
216 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w)
217 : x(static_cast<T>(_xy.x))
218 , y(static_cast<T>(_xy.y))
219 , z(static_cast<T>(_z.x))
220 , w(static_cast<T>(_w.x))
221 {}
222
223 template<typename T, qualifier Q>
224 template<typename A, typename B, typename C, qualifier P>
225 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<2, B, P> const& _yz, C _w)
226 : x(static_cast<T>(_x))
227 , y(static_cast<T>(_yz.x))
228 , z(static_cast<T>(_yz.y))
229 , w(static_cast<T>(_w))
230 {}
231
232 template<typename T, qualifier Q>
233 template<typename A, typename B, typename C, qualifier P>
234 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, C _w)
235 : x(static_cast<T>(_x.x))
236 , y(static_cast<T>(_yz.x))
237 , z(static_cast<T>(_yz.y))
238 , w(static_cast<T>(_w))
239 {}
240
241 template<typename T, qualifier Q>
242 template<typename A, typename B, typename C, qualifier P>
243 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w)
244 : x(static_cast<T>(_x))
245 , y(static_cast<T>(_yz.x))
246 , z(static_cast<T>(_yz.y))
247 , w(static_cast<T>(_w.x))
248 {}
249
250 template<typename T, qualifier Q>
251 template<typename A, typename B, typename C, qualifier P>
252 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w)
253 : x(static_cast<T>(_x.x))
254 , y(static_cast<T>(_yz.x))
255 , z(static_cast<T>(_yz.y))
256 , w(static_cast<T>(_w.x))
257 {}
258
259 template<typename T, qualifier Q>
260 template<typename A, typename B, typename C, qualifier P>
261 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, B _y, vec<2, C, P> const& _zw)
262 : x(static_cast<T>(_x))
263 , y(static_cast<T>(_y))
264 , z(static_cast<T>(_zw.x))
265 , w(static_cast<T>(_zw.y))
266 {}
267
268 template<typename T, qualifier Q>
269 template<typename A, typename B, typename C, qualifier P>
270 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, B _y, vec<2, C, P> const& _zw)
271 : x(static_cast<T>(_x.x))
272 , y(static_cast<T>(_y))
273 , z(static_cast<T>(_zw.x))
274 , w(static_cast<T>(_zw.y))
275 {}
276
277 template<typename T, qualifier Q>
278 template<typename A, typename B, typename C, qualifier P>
279 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw)
280 : x(static_cast<T>(_x))
281 , y(static_cast<T>(_y.x))
282 , z(static_cast<T>(_zw.x))
283 , w(static_cast<T>(_zw.y))
284 {}
285
286 template<typename T, qualifier Q>
287 template<typename A, typename B, typename C, qualifier P>
288 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw)
289 : x(static_cast<T>(_x.x))
290 , y(static_cast<T>(_y.x))
291 , z(static_cast<T>(_zw.x))
292 , w(static_cast<T>(_zw.y))
293 {}
294
295 template<typename T, qualifier Q>
296 template<typename A, typename B, qualifier P>
297 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<3, A, P> const& _xyz, B _w)
298 : x(static_cast<T>(_xyz.x))
299 , y(static_cast<T>(_xyz.y))
300 , z(static_cast<T>(_xyz.z))
301 , w(static_cast<T>(_w))
302 {}
303
304 template<typename T, qualifier Q>
305 template<typename A, typename B, qualifier P>
306 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w)
307 : x(static_cast<T>(_xyz.x))
308 , y(static_cast<T>(_xyz.y))
309 , z(static_cast<T>(_xyz.z))
310 , w(static_cast<T>(_w.x))
311 {}
312
313 template<typename T, qualifier Q>
314 template<typename A, typename B, qualifier P>
315 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(A _x, vec<3, B, P> const& _yzw)
316 : x(static_cast<T>(_x))
317 , y(static_cast<T>(_yzw.x))
318 , z(static_cast<T>(_yzw.y))
319 , w(static_cast<T>(_yzw.z))
320 {}
321
322 template<typename T, qualifier Q>
323 template<typename A, typename B, qualifier P>
324 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw)
325 : x(static_cast<T>(_x.x))
326 , y(static_cast<T>(_yzw.x))
327 , z(static_cast<T>(_yzw.y))
328 , w(static_cast<T>(_yzw.z))
329 {}
330
331 template<typename T, qualifier Q>
332 template<typename A, typename B, qualifier P>
333 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw)
334 : x(static_cast<T>(_xy.x))
335 , y(static_cast<T>(_xy.y))
336 , z(static_cast<T>(_zw.x))
337 , w(static_cast<T>(_zw.y))
338 {}
339
340 template<typename T, qualifier Q>
341 template<typename U, qualifier P>
342 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>::vec(vec<4, U, P> const& v)
343 : x(static_cast<T>(v.x))
344 , y(static_cast<T>(v.y))
345 , z(static_cast<T>(v.z))
346 , w(static_cast<T>(v.w))
347 {}
348
349
350 // -- Component accesses --
351
352 template<typename T, qualifier Q>
353 GLM_FUNC_QUALIFIER GLM_CONSTEXPR T& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i)
354 {
355 GLM_ASSERT_LENGTH(i, this->length());
356 switch (i)
357 {
358 default:
359 case 0:
360 return x;
361 case 1:
362 return y;
363 case 2:
364 return z;
365 case 3:
366 return w;
367 }
368 }
369
370 template<typename T, qualifier Q>
371 GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i) const
372 {
373 GLM_ASSERT_LENGTH(i, this->length());
374 switch (i)
375 {
376 default:
377 case 0:
378 return x;
379 case 1:
380 return y;
381 case 2:
382 return z;
383 case 3:
384 return w;
385 }
386 }
387
388 // -- Unary arithmetic operators --
389
390 template<typename T, qualifier Q>
391 template<typename U>
392 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q>& vec<4, T, Q>::operator=(vec<4, U, Q> const& v)
393 {
394 this->x = static_cast<T>(v.x);
395 this->y = static_cast<T>(v.y);
396 this->z = static_cast<T>(v.z);
397 this->w = static_cast<T>(v.w);
398 return *this;
399 }
400
401 template<typename T, qualifier Q>
402 template<typename U>
403 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator+=(U scalar)
404 {
405 return (*this = detail::compute_vec_add<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));
406 }
407
408 template<typename T, qualifier Q>
409 template<typename U>
410 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator+=(vec<1, U, Q> const& v)
411 {
412 return (*this = detail::compute_vec_add<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x)));
413 }
414
415 template<typename T, qualifier Q>
416 template<typename U>
417 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator+=(vec<4, U, Q> const& v)
418 {
419 return (*this = detail::compute_vec_add<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
420 }
421
422 template<typename T, qualifier Q>
423 template<typename U>
424 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator-=(U scalar)
425 {
426 return (*this = detail::compute_vec_sub<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));
427 }
428
429 template<typename T, qualifier Q>
430 template<typename U>
431 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator-=(vec<1, U, Q> const& v)
432 {
433 return (*this = detail::compute_vec_sub<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x)));
434 }
435
436 template<typename T, qualifier Q>
437 template<typename U>
438 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator-=(vec<4, U, Q> const& v)
439 {
440 return (*this = detail::compute_vec_sub<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
441 }
442
443 template<typename T, qualifier Q>
444 template<typename U>
445 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator*=(U scalar)
446 {
447 return (*this = detail::compute_vec_mul<4,T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));
448 }
449
450 template<typename T, qualifier Q>
451 template<typename U>
452 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator*=(vec<1, U, Q> const& v)
453 {
454 return (*this = detail::compute_vec_mul<4,T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x)));
455 }
456
457 template<typename T, qualifier Q>
458 template<typename U>
459 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator*=(vec<4, U, Q> const& v)
460 {
461 return (*this = detail::compute_vec_mul<4,T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
462 }
463
464 template<typename T, qualifier Q>
465 template<typename U>
466 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator/=(U scalar)
467 {
468 return (*this = detail::compute_vec_div<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));
469 }
470
471 template<typename T, qualifier Q>
472 template<typename U>
473 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator/=(vec<1, U, Q> const& v)
474 {
475 return (*this = detail::compute_vec_div<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v.x)));
476 }
477
478 template<typename T, qualifier Q>
479 template<typename U>
480 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator/=(vec<4, U, Q> const& v)
481 {
482 return (*this = detail::compute_vec_div<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
483 }
484
485 // -- Increment and decrement operators --
486
487 template<typename T, qualifier Q>
488 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator++()
489 {
490 ++this->x;
491 ++this->y;
492 ++this->z;
493 ++this->w;
494 return *this;
495 }
496
497 template<typename T, qualifier Q>
498 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator--()
499 {
500 --this->x;
501 --this->y;
502 --this->z;
503 --this->w;
504 return *this;
505 }
506
507 template<typename T, qualifier Q>
508 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> vec<4, T, Q>::operator++(int)
509 {
510 vec<4, T, Q> Result(*this);
511 ++*this;
512 return Result;
513 }
514
515 template<typename T, qualifier Q>
516 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> vec<4, T, Q>::operator--(int)
517 {
518 vec<4, T, Q> Result(*this);
519 --*this;
520 return Result;
521 }
522
523 // -- Unary bit operators --
524
525 template<typename T, qualifier Q>
526 template<typename U>
527 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator%=(U scalar)
528 {
529 return (*this = detail::compute_vec_mod<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));
530 }
531
532 template<typename T, qualifier Q>
533 template<typename U>
534 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator%=(vec<1, U, Q> const& v)
535 {
536 return (*this = detail::compute_vec_mod<3, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<3, T, Q>(v)));
537 }
538
539 template<typename T, qualifier Q>
540 template<typename U>
541 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator%=(vec<4, U, Q> const& v)
542 {
543 return (*this = detail::compute_vec_mod<4, T, Q, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
544 }
545
546 template<typename T, qualifier Q>
547 template<typename U>
548 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator&=(U scalar)
549 {
550 return (*this = detail::compute_vec_and<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));
551 }
552
553 template<typename T, qualifier Q>
554 template<typename U>
555 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator&=(vec<1, U, Q> const& v)
556 {
557 return (*this = detail::compute_vec_and<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
558 }
559
560 template<typename T, qualifier Q>
561 template<typename U>
562 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator&=(vec<4, U, Q> const& v)
563 {
564 return (*this = detail::compute_vec_and<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
565 }
566
567 template<typename T, qualifier Q>
568 template<typename U>
569 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator|=(U scalar)
570 {
571 return (*this = detail::compute_vec_or<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));
572 }
573
574 template<typename T, qualifier Q>
575 template<typename U>
576 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator|=(vec<1, U, Q> const& v)
577 {
578 return (*this = detail::compute_vec_or<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
579 }
580
581 template<typename T, qualifier Q>
582 template<typename U>
583 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator|=(vec<4, U, Q> const& v)
584 {
585 return (*this = detail::compute_vec_or<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
586 }
587
588 template<typename T, qualifier Q>
589 template<typename U>
590 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator^=(U scalar)
591 {
592 return (*this = detail::compute_vec_xor<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));
593 }
594
595 template<typename T, qualifier Q>
596 template<typename U>
597 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator^=(vec<1, U, Q> const& v)
598 {
599 return (*this = detail::compute_vec_xor<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
600 }
601
602 template<typename T, qualifier Q>
603 template<typename U>
604 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator^=(vec<4, U, Q> const& v)
605 {
606 return (*this = detail::compute_vec_xor<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
607 }
608
609 template<typename T, qualifier Q>
610 template<typename U>
611 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator<<=(U scalar)
612 {
613 return (*this = detail::compute_vec_shift_left<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));
614 }
615
616 template<typename T, qualifier Q>
617 template<typename U>
618 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator<<=(vec<1, U, Q> const& v)
619 {
620 return (*this = detail::compute_vec_shift_left<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
621 }
622
623 template<typename T, qualifier Q>
624 template<typename U>
625 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator<<=(vec<4, U, Q> const& v)
626 {
627 return (*this = detail::compute_vec_shift_left<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
628 }
629
630 template<typename T, qualifier Q>
631 template<typename U>
632 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator>>=(U scalar)
633 {
634 return (*this = detail::compute_vec_shift_right<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(scalar)));
635 }
636
637 template<typename T, qualifier Q>
638 template<typename U>
639 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator>>=(vec<1, U, Q> const& v)
640 {
641 return (*this = detail::compute_vec_shift_right<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
642 }
643
644 template<typename T, qualifier Q>
645 template<typename U>
646 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> & vec<4, T, Q>::operator>>=(vec<4, U, Q> const& v)
647 {
648 return (*this = detail::compute_vec_shift_right<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(*this, vec<4, T, Q>(v)));
649 }
650
651 // -- Unary constant operators --
652
653 template<typename T, qualifier Q>
654 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v)
655 {
656 return v;
657 }
658
659 template<typename T, qualifier Q>
660 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v)
661 {
662 return vec<4, T, Q>(0) -= v;
663 }
664
665 // -- Binary arithmetic operators --
666
667 template<typename T, qualifier Q>
668 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v, T scalar)
669 {
670 return vec<4, T, Q>(v) += scalar;
671 }
672
673 template<typename T, qualifier Q>
674 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)
675 {
676 return vec<4, T, Q>(v1) += v2;
677 }
678
679 template<typename T, qualifier Q>
680 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v)
681 {
682 return vec<4, T, Q>(v) += scalar;
683 }
684
685 template<typename T, qualifier Q>
686 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)
687 {
688 return vec<4, T, Q>(v2) += v1;
689 }
690
691 template<typename T, qualifier Q>
692 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
693 {
694 return vec<4, T, Q>(v1) += v2;
695 }
696
697 template<typename T, qualifier Q>
698 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v, T scalar)
699 {
700 return vec<4, T, Q>(v) -= scalar;
701 }
702
703 template<typename T, qualifier Q>
704 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)
705 {
706 return vec<4, T, Q>(v1) -= v2;
707 }
708
709 template<typename T, qualifier Q>
710 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v)
711 {
712 return vec<4, T, Q>(scalar) -= v;
713 }
714
715 template<typename T, qualifier Q>
716 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)
717 {
718 return vec<4, T, Q>(v1.x) -= v2;
719 }
720
721 template<typename T, qualifier Q>
722 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
723 {
724 return vec<4, T, Q>(v1) -= v2;
725 }
726
727 template<typename T, qualifier Q>
728 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, T scalar)
729 {
730 return vec<4, T, Q>(v) *= scalar;
731 }
732
733 template<typename T, qualifier Q>
734 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)
735 {
736 return vec<4, T, Q>(v1) *= v2;
737 }
738
739 template<typename T, qualifier Q>
740 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v)
741 {
742 return vec<4, T, Q>(v) *= scalar;
743 }
744
745 template<typename T, qualifier Q>
746 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)
747 {
748 return vec<4, T, Q>(v2) *= v1;
749 }
750
751 template<typename T, qualifier Q>
752 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
753 {
754 return vec<4, T, Q>(v1) *= v2;
755 }
756
757 template<typename T, qualifier Q>
758 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v, T scalar)
759 {
760 return vec<4, T, Q>(v) /= scalar;
761 }
762
763 template<typename T, qualifier Q>
764 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)
765 {
766 return vec<4, T, Q>(v1) /= v2;
767 }
768
769 template<typename T, qualifier Q>
770 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v)
771 {
772 return vec<4, T, Q>(scalar) /= v;
773 }
774
775 template<typename T, qualifier Q>
776 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)
777 {
778 return vec<4, T, Q>(v1.x) /= v2;
779 }
780
781 template<typename T, qualifier Q>
782 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
783 {
784 return vec<4, T, Q>(v1) /= v2;
785 }
786
787 // -- Binary bit operators --
788
789 template<typename T, qualifier Q>
790 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar)
791 {
792 return vec<4, T, Q>(v) %= scalar;
793 }
794
795 template<typename T, qualifier Q>
796 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)
797 {
798 return vec<4, T, Q>(v1) %= v2.x;
799 }
800
801 template<typename T, qualifier Q>
802 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v)
803 {
804 return vec<4, T, Q>(scalar) %= v;
805 }
806
807 template<typename T, qualifier Q>
808 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v)
809 {
810 return vec<4, T, Q>(scalar.x) %= v;
811 }
812
813 template<typename T, qualifier Q>
814 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
815 {
816 return vec<4, T, Q>(v1) %= v2;
817 }
818
819 template<typename T, qualifier Q>
820 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar)
821 {
822 return vec<4, T, Q>(v) &= scalar;
823 }
824
825 template<typename T, qualifier Q>
826 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar)
827 {
828 return vec<4, T, Q>(v) &= scalar;
829 }
830
831 template<typename T, qualifier Q>
832 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v)
833 {
834 return vec<4, T, Q>(scalar) &= v;
835 }
836
837 template<typename T, qualifier Q>
838 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)
839 {
840 return vec<4, T, Q>(v1.x) &= v2;
841 }
842
843 template<typename T, qualifier Q>
844 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
845 {
846 return vec<4, T, Q>(v1) &= v2;
847 }
848
849 template<typename T, qualifier Q>
850 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar)
851 {
852 return vec<4, T, Q>(v) |= scalar;
853 }
854
855 template<typename T, qualifier Q>
856 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)
857 {
858 return vec<4, T, Q>(v1) |= v2.x;
859 }
860
861 template<typename T, qualifier Q>
862 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v)
863 {
864 return vec<4, T, Q>(scalar) |= v;
865 }
866
867 template<typename T, qualifier Q>
868 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)
869 {
870 return vec<4, T, Q>(v1.x) |= v2;
871 }
872
873 template<typename T, qualifier Q>
874 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
875 {
876 return vec<4, T, Q>(v1) |= v2;
877 }
878
879 template<typename T, qualifier Q>
880 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar)
881 {
882 return vec<4, T, Q>(v) ^= scalar;
883 }
884
885 template<typename T, qualifier Q>
886 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)
887 {
888 return vec<4, T, Q>(v1) ^= v2.x;
889 }
890
891 template<typename T, qualifier Q>
892 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v)
893 {
894 return vec<4, T, Q>(scalar) ^= v;
895 }
896
897 template<typename T, qualifier Q>
898 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)
899 {
900 return vec<4, T, Q>(v1.x) ^= v2;
901 }
902
903 template<typename T, qualifier Q>
904 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
905 {
906 return vec<4, T, Q>(v1) ^= v2;
907 }
908
909 template<typename T, qualifier Q>
910 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar)
911 {
912 return vec<4, T, Q>(v) <<= scalar;
913 }
914
915 template<typename T, qualifier Q>
916 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)
917 {
918 return vec<4, T, Q>(v1) <<= v2.x;
919 }
920
921 template<typename T, qualifier Q>
922 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v)
923 {
924 return vec<4, T, Q>(scalar) <<= v;
925 }
926
927 template<typename T, qualifier Q>
928 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)
929 {
930 return vec<4, T, Q>(v1.x) <<= v2;
931 }
932
933 template<typename T, qualifier Q>
934 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
935 {
936 return vec<4, T, Q>(v1) <<= v2;
937 }
938
939 template<typename T, qualifier Q>
940 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar)
941 {
942 return vec<4, T, Q>(v) >>= scalar;
943 }
944
945 template<typename T, qualifier Q>
946 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2)
947 {
948 return vec<4, T, Q>(v1) >>= v2.x;
949 }
950
951 template<typename T, qualifier Q>
952 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v)
953 {
954 return vec<4, T, Q>(scalar) >>= v;
955 }
956
957 template<typename T, qualifier Q>
958 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2)
959 {
960 return vec<4, T, Q>(v1.x) >>= v2;
961 }
962
963 template<typename T, qualifier Q>
964 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
965 {
966 return vec<4, T, Q>(v1) >>= v2;
967 }
968
969 template<typename T, qualifier Q>
970 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, T, Q> operator~(vec<4, T, Q> const& v)
971 {
972 return detail::compute_vec_bitwise_not<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v);
973 }
974
975 // -- Boolean operators --
976
977 template<typename T, qualifier Q>
978 GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
979 {
980 return detail::compute_vec_equal<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2);
981 }
982
983 template<typename T, qualifier Q>
984 GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
985 {
986 return detail::compute_vec_nequal<4, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2);
987 }
988
989 template<qualifier Q>
990 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2)
991 {
992 return vec<4, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z, v1.w && v2.w);
993 }
994
995 template<qualifier Q>
996 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2)
997 {
998 return vec<4, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z, v1.w || v2.w);
999 }
1000}//namespace glm
1001
1002#if GLM_CONFIG_SIMD == GLM_ENABLE
1003# include "type_vec_simd.inl"
1004
1005namespace glm {
1006/* build errors on Windows ARM Github C.I.
1007#if GLM_ARCH & GLM_ARCH_NEON_BIT && !GLM_CONFIG_XYZW_ONLY
1008 CTORSL(4, CTOR_FLOAT);
1009 CTORSL(4, CTOR_INT);
1010 CTORSL(4, CTOR_UINT);
1011 CTORSL(4, CTOR_VECF_INT4);
1012 CTORSL(4, CTOR_VECF_UINT4);
1013 CTORSL(4, CTOR_VECF_VECF);
1014 CTORSL(4, CTOR_VECF_VECI);
1015 CTORSL(4, CTOR_VECF_VECU);
1016#endif// GLM_ARCH & GLM_ARCH_NEON_BIT
1017*/
1018#if GLM_ARCH & GLM_ARCH_SSE2_BIT
1019 CTORSL(4, CTOR_FLOAT);
1020 CTORSL(4, CTOR_DOUBLE);
1021 CTORSL(4, CTOR_FLOAT4);
1022 CTORSL(4, CTOR_DOUBLE4);
1023 CTORSL(4, CTOR_INT);
1024 CTORSL(4, CTOR_INT4);
1025 CTORSL(4, CTOR_VECF_INT4);
1026
1027 template<>
1028 template<>
1029 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(const vec<4, float, aligned_highp>& v):
1030 data(v.data)
1031 {
1032 }
1033
1034 template<>
1035 template<>
1036 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, aligned_highp>::vec(const vec<4, float, packed_highp>& v)
1037 {
1038 data = _mm_loadu_ps(reinterpret_cast<const float*>(&v));
1039 }
1040
1041 template<>
1042 template<>
1043 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, float, packed_highp>::vec(const vec<4, float, aligned_highp>& v)
1044 {
1045 _mm_storeu_ps(reinterpret_cast<float*>(this), v.data);
1046 }
1047
1048 template<>
1049 template<>
1050 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_highp>::vec(const vec<4, int, aligned_highp>& v) :
1051 data(v.data)
1052 {
1053 }
1054
1055 template<>
1056 template<>
1057 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, aligned_highp>::vec(const vec<4, int, packed_highp>& v)
1058 {
1059 data = _mm_loadu_si128(reinterpret_cast<const __m128i*>(&v));
1060 }
1061
1062 template<>
1063 template<>
1064 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, int, packed_highp>::vec(const vec<4, int, aligned_highp>& v)
1065 {
1066 _mm_storeu_si128(reinterpret_cast<__m128i*>(this), v.data);
1067 }
1068
1069 template<>
1070 template<>
1071 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, double, aligned_highp>::vec(const vec<4, double, aligned_highp>& v)
1072 {
1073# if (GLM_ARCH & GLM_ARCH_AVX_BIT)
1074 data = v.data;
1075#else
1076 data.setv(0, v.data.getv(0));
1077 data.setv(1, v.data.getv(1));
1078#endif
1079 }
1080
1081 template<>
1082 template<>
1083 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, double, aligned_highp>::vec(const vec<4, double, packed_highp>& v)
1084 {
1085# if (GLM_ARCH & GLM_ARCH_AVX_BIT)
1086 data = _mm256_loadu_pd(reinterpret_cast<const double*>(&v));
1087#else
1088 data.setv(0, _mm_loadu_pd(reinterpret_cast<const double*>(&v)));
1089 data.setv(1, _mm_loadu_pd(reinterpret_cast<const double*>(&v)+2));
1090#endif
1091 }
1092
1093 template<>
1094 template<>
1095 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<4, double, packed_highp>::vec(const vec<4, double, aligned_highp>& v)
1096 {
1097# if (GLM_ARCH & GLM_ARCH_AVX_BIT)
1098 _mm256_storeu_pd(reinterpret_cast<double*>(this), v.data);
1099#else
1100 _mm_storeu_pd(reinterpret_cast<double*>(this), v.data.getv(0));
1101 _mm_storeu_pd(reinterpret_cast<double*>(this) + 2, v.data.getv(1));
1102#endif
1103 }
1104
1105#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT
1106}
1107
1108#endif