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