1.0.2 API documentation
vec_swizzle.hpp
Go to the documentation of this file.
1 
13 #pragma once
14 
15 #include "../glm.hpp"
16 
17 #ifndef GLM_ENABLE_EXPERIMENTAL
18 # error "GLM: GLM_GTX_vec_swizzle is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
19 #elif GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
20 # pragma message("GLM: GLM_GTX_vec_swizzle extension included")
21 #endif
22 
23 namespace glm {
26 
27  // xx
28  template<typename T, qualifier Q>
29  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> xx(const glm::vec<1, T, Q> &v) {
30  return glm::vec<2, T, Q>(v.x, v.x);
31  }
32 
33  template<typename T, qualifier Q>
34  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> xx(const glm::vec<2, T, Q> &v) {
35  return glm::vec<2, T, Q>(v.x, v.x);
36  }
37 
38  template<typename T, qualifier Q>
39  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> xx(const glm::vec<3, T, Q> &v) {
40  return glm::vec<2, T, Q>(v.x, v.x);
41  }
42 
43  template<typename T, qualifier Q>
44  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> xx(const glm::vec<4, T, Q> &v) {
45  return glm::vec<2, T, Q>(v.x, v.x);
46  }
47 
48  // xy
49  template<typename T, qualifier Q>
50  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> xy(const glm::vec<2, T, Q> &v) {
51  return glm::vec<2, T, Q>(v.x, v.y);
52  }
53 
54  template<typename T, qualifier Q>
55  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> xy(const glm::vec<3, T, Q> &v) {
56  return glm::vec<2, T, Q>(v.x, v.y);
57  }
58 
59  template<typename T, qualifier Q>
60  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> xy(const glm::vec<4, T, Q> &v) {
61  return glm::vec<2, T, Q>(v.x, v.y);
62  }
63 
64  // xz
65  template<typename T, qualifier Q>
66  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> xz(const glm::vec<3, T, Q> &v) {
67  return glm::vec<2, T, Q>(v.x, v.z);
68  }
69 
70  template<typename T, qualifier Q>
71  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> xz(const glm::vec<4, T, Q> &v) {
72  return glm::vec<2, T, Q>(v.x, v.z);
73  }
74 
75  // xw
76  template<typename T, qualifier Q>
77  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> xw(const glm::vec<4, T, Q> &v) {
78  return glm::vec<2, T, Q>(v.x, v.w);
79  }
80 
81  // yx
82  template<typename T, qualifier Q>
83  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> yx(const glm::vec<2, T, Q> &v) {
84  return glm::vec<2, T, Q>(v.y, v.x);
85  }
86 
87  template<typename T, qualifier Q>
88  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> yx(const glm::vec<3, T, Q> &v) {
89  return glm::vec<2, T, Q>(v.y, v.x);
90  }
91 
92  template<typename T, qualifier Q>
93  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> yx(const glm::vec<4, T, Q> &v) {
94  return glm::vec<2, T, Q>(v.y, v.x);
95  }
96 
97  // yy
98  template<typename T, qualifier Q>
99  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> yy(const glm::vec<2, T, Q> &v) {
100  return glm::vec<2, T, Q>(v.y, v.y);
101  }
102 
103  template<typename T, qualifier Q>
104  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> yy(const glm::vec<3, T, Q> &v) {
105  return glm::vec<2, T, Q>(v.y, v.y);
106  }
107 
108  template<typename T, qualifier Q>
109  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> yy(const glm::vec<4, T, Q> &v) {
110  return glm::vec<2, T, Q>(v.y, v.y);
111  }
112 
113  // yz
114  template<typename T, qualifier Q>
115  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> yz(const glm::vec<3, T, Q> &v) {
116  return glm::vec<2, T, Q>(v.y, v.z);
117  }
118 
119  template<typename T, qualifier Q>
120  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> yz(const glm::vec<4, T, Q> &v) {
121  return glm::vec<2, T, Q>(v.y, v.z);
122  }
123 
124  // yw
125  template<typename T, qualifier Q>
126  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> yw(const glm::vec<4, T, Q> &v) {
127  return glm::vec<2, T, Q>(v.y, v.w);
128  }
129 
130  // zx
131  template<typename T, qualifier Q>
132  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> zx(const glm::vec<3, T, Q> &v) {
133  return glm::vec<2, T, Q>(v.z, v.x);
134  }
135 
136  template<typename T, qualifier Q>
137  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> zx(const glm::vec<4, T, Q> &v) {
138  return glm::vec<2, T, Q>(v.z, v.x);
139  }
140 
141  // zy
142  template<typename T, qualifier Q>
143  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> zy(const glm::vec<3, T, Q> &v) {
144  return glm::vec<2, T, Q>(v.z, v.y);
145  }
146 
147  template<typename T, qualifier Q>
148  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> zy(const glm::vec<4, T, Q> &v) {
149  return glm::vec<2, T, Q>(v.z, v.y);
150  }
151 
152  // zz
153  template<typename T, qualifier Q>
154  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> zz(const glm::vec<3, T, Q> &v) {
155  return glm::vec<2, T, Q>(v.z, v.z);
156  }
157 
158  template<typename T, qualifier Q>
159  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> zz(const glm::vec<4, T, Q> &v) {
160  return glm::vec<2, T, Q>(v.z, v.z);
161  }
162 
163  // zw
164  template<typename T, qualifier Q>
165  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> zw(const glm::vec<4, T, Q> &v) {
166  return glm::vec<2, T, Q>(v.z, v.w);
167  }
168 
169  // wx
170  template<typename T, qualifier Q>
171  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> wx(const glm::vec<4, T, Q> &v) {
172  return glm::vec<2, T, Q>(v.w, v.x);
173  }
174 
175  // wy
176  template<typename T, qualifier Q>
177  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> wy(const glm::vec<4, T, Q> &v) {
178  return glm::vec<2, T, Q>(v.w, v.y);
179  }
180 
181  // wz
182  template<typename T, qualifier Q>
183  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> wz(const glm::vec<4, T, Q> &v) {
184  return glm::vec<2, T, Q>(v.w, v.z);
185  }
186 
187  // ww
188  template<typename T, qualifier Q>
189  GLM_FUNC_QUALIFIER glm::vec<2, T, Q> ww(const glm::vec<4, T, Q> &v) {
190  return glm::vec<2, T, Q>(v.w, v.w);
191  }
192 
193  // xxx
194  template<typename T, qualifier Q>
195  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xxx(const glm::vec<1, T, Q> &v) {
196  return glm::vec<3, T, Q>(v.x, v.x, v.x);
197  }
198 
199  template<typename T, qualifier Q>
200  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xxx(const glm::vec<2, T, Q> &v) {
201  return glm::vec<3, T, Q>(v.x, v.x, v.x);
202  }
203 
204  template<typename T, qualifier Q>
205  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xxx(const glm::vec<3, T, Q> &v) {
206  return glm::vec<3, T, Q>(v.x, v.x, v.x);
207  }
208 
209  template<typename T, qualifier Q>
210  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xxx(const glm::vec<4, T, Q> &v) {
211  return glm::vec<3, T, Q>(v.x, v.x, v.x);
212  }
213 
214  // xxy
215  template<typename T, qualifier Q>
216  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xxy(const glm::vec<2, T, Q> &v) {
217  return glm::vec<3, T, Q>(v.x, v.x, v.y);
218  }
219 
220  template<typename T, qualifier Q>
221  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xxy(const glm::vec<3, T, Q> &v) {
222  return glm::vec<3, T, Q>(v.x, v.x, v.y);
223  }
224 
225  template<typename T, qualifier Q>
226  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xxy(const glm::vec<4, T, Q> &v) {
227  return glm::vec<3, T, Q>(v.x, v.x, v.y);
228  }
229 
230  // xxz
231  template<typename T, qualifier Q>
232  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xxz(const glm::vec<3, T, Q> &v) {
233  return glm::vec<3, T, Q>(v.x, v.x, v.z);
234  }
235 
236  template<typename T, qualifier Q>
237  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xxz(const glm::vec<4, T, Q> &v) {
238  return glm::vec<3, T, Q>(v.x, v.x, v.z);
239  }
240 
241  // xxw
242  template<typename T, qualifier Q>
243  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xxw(const glm::vec<4, T, Q> &v) {
244  return glm::vec<3, T, Q>(v.x, v.x, v.w);
245  }
246 
247  // xyx
248  template<typename T, qualifier Q>
249  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xyx(const glm::vec<2, T, Q> &v) {
250  return glm::vec<3, T, Q>(v.x, v.y, v.x);
251  }
252 
253  template<typename T, qualifier Q>
254  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xyx(const glm::vec<3, T, Q> &v) {
255  return glm::vec<3, T, Q>(v.x, v.y, v.x);
256  }
257 
258  template<typename T, qualifier Q>
259  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xyx(const glm::vec<4, T, Q> &v) {
260  return glm::vec<3, T, Q>(v.x, v.y, v.x);
261  }
262 
263  // xyy
264  template<typename T, qualifier Q>
265  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xyy(const glm::vec<2, T, Q> &v) {
266  return glm::vec<3, T, Q>(v.x, v.y, v.y);
267  }
268 
269  template<typename T, qualifier Q>
270  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xyy(const glm::vec<3, T, Q> &v) {
271  return glm::vec<3, T, Q>(v.x, v.y, v.y);
272  }
273 
274  template<typename T, qualifier Q>
275  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xyy(const glm::vec<4, T, Q> &v) {
276  return glm::vec<3, T, Q>(v.x, v.y, v.y);
277  }
278 
279  // xyz
280  template<typename T, qualifier Q>
281  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xyz(const glm::vec<3, T, Q> &v) {
282  return glm::vec<3, T, Q>(v.x, v.y, v.z);
283  }
284 
285  // xyw
286  template<typename T, qualifier Q>
287  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xyw(const glm::vec<4, T, Q> &v) {
288  return glm::vec<3, T, Q>(v.x, v.y, v.w);
289  }
290 
291  // xzx
292  template<typename T, qualifier Q>
293  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xzx(const glm::vec<3, T, Q> &v) {
294  return glm::vec<3, T, Q>(v.x, v.z, v.x);
295  }
296 
297  template<typename T, qualifier Q>
298  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xzx(const glm::vec<4, T, Q> &v) {
299  return glm::vec<3, T, Q>(v.x, v.z, v.x);
300  }
301 
302  // xzy
303  template<typename T, qualifier Q>
304  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xzy(const glm::vec<3, T, Q> &v) {
305  return glm::vec<3, T, Q>(v.x, v.z, v.y);
306  }
307 
308  template<typename T, qualifier Q>
309  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xzy(const glm::vec<4, T, Q> &v) {
310  return glm::vec<3, T, Q>(v.x, v.z, v.y);
311  }
312 
313  // xzz
314  template<typename T, qualifier Q>
315  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xzz(const glm::vec<3, T, Q> &v) {
316  return glm::vec<3, T, Q>(v.x, v.z, v.z);
317  }
318 
319  template<typename T, qualifier Q>
320  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xzz(const glm::vec<4, T, Q> &v) {
321  return glm::vec<3, T, Q>(v.x, v.z, v.z);
322  }
323 
324  // xzw
325  template<typename T, qualifier Q>
326  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xzw(const glm::vec<4, T, Q> &v) {
327  return glm::vec<3, T, Q>(v.x, v.z, v.w);
328  }
329 
330  // xwx
331  template<typename T, qualifier Q>
332  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xwx(const glm::vec<4, T, Q> &v) {
333  return glm::vec<3, T, Q>(v.x, v.w, v.x);
334  }
335 
336  // xwy
337  template<typename T, qualifier Q>
338  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xwy(const glm::vec<4, T, Q> &v) {
339  return glm::vec<3, T, Q>(v.x, v.w, v.y);
340  }
341 
342  // xwz
343  template<typename T, qualifier Q>
344  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xwz(const glm::vec<4, T, Q> &v) {
345  return glm::vec<3, T, Q>(v.x, v.w, v.z);
346  }
347 
348  // xww
349  template<typename T, qualifier Q>
350  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> xww(const glm::vec<4, T, Q> &v) {
351  return glm::vec<3, T, Q>(v.x, v.w, v.w);
352  }
353 
354  // yxx
355  template<typename T, qualifier Q>
356  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yxx(const glm::vec<2, T, Q> &v) {
357  return glm::vec<3, T, Q>(v.y, v.x, v.x);
358  }
359 
360  template<typename T, qualifier Q>
361  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yxx(const glm::vec<3, T, Q> &v) {
362  return glm::vec<3, T, Q>(v.y, v.x, v.x);
363  }
364 
365  template<typename T, qualifier Q>
366  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yxx(const glm::vec<4, T, Q> &v) {
367  return glm::vec<3, T, Q>(v.y, v.x, v.x);
368  }
369 
370  // yxy
371  template<typename T, qualifier Q>
372  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yxy(const glm::vec<2, T, Q> &v) {
373  return glm::vec<3, T, Q>(v.y, v.x, v.y);
374  }
375 
376  template<typename T, qualifier Q>
377  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yxy(const glm::vec<3, T, Q> &v) {
378  return glm::vec<3, T, Q>(v.y, v.x, v.y);
379  }
380 
381  template<typename T, qualifier Q>
382  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yxy(const glm::vec<4, T, Q> &v) {
383  return glm::vec<3, T, Q>(v.y, v.x, v.y);
384  }
385 
386  // yxz
387  template<typename T, qualifier Q>
388  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yxz(const glm::vec<3, T, Q> &v) {
389  return glm::vec<3, T, Q>(v.y, v.x, v.z);
390  }
391 
392  template<typename T, qualifier Q>
393  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yxz(const glm::vec<4, T, Q> &v) {
394  return glm::vec<3, T, Q>(v.y, v.x, v.z);
395  }
396 
397  // yxw
398  template<typename T, qualifier Q>
399  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yxw(const glm::vec<4, T, Q> &v) {
400  return glm::vec<3, T, Q>(v.y, v.x, v.w);
401  }
402 
403  // yyx
404  template<typename T, qualifier Q>
405  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yyx(const glm::vec<2, T, Q> &v) {
406  return glm::vec<3, T, Q>(v.y, v.y, v.x);
407  }
408 
409  template<typename T, qualifier Q>
410  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yyx(const glm::vec<3, T, Q> &v) {
411  return glm::vec<3, T, Q>(v.y, v.y, v.x);
412  }
413 
414  template<typename T, qualifier Q>
415  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yyx(const glm::vec<4, T, Q> &v) {
416  return glm::vec<3, T, Q>(v.y, v.y, v.x);
417  }
418 
419  // yyy
420  template<typename T, qualifier Q>
421  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yyy(const glm::vec<2, T, Q> &v) {
422  return glm::vec<3, T, Q>(v.y, v.y, v.y);
423  }
424 
425  template<typename T, qualifier Q>
426  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yyy(const glm::vec<3, T, Q> &v) {
427  return glm::vec<3, T, Q>(v.y, v.y, v.y);
428  }
429 
430  template<typename T, qualifier Q>
431  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yyy(const glm::vec<4, T, Q> &v) {
432  return glm::vec<3, T, Q>(v.y, v.y, v.y);
433  }
434 
435  // yyz
436  template<typename T, qualifier Q>
437  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yyz(const glm::vec<3, T, Q> &v) {
438  return glm::vec<3, T, Q>(v.y, v.y, v.z);
439  }
440 
441  template<typename T, qualifier Q>
442  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yyz(const glm::vec<4, T, Q> &v) {
443  return glm::vec<3, T, Q>(v.y, v.y, v.z);
444  }
445 
446  // yyw
447  template<typename T, qualifier Q>
448  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yyw(const glm::vec<4, T, Q> &v) {
449  return glm::vec<3, T, Q>(v.y, v.y, v.w);
450  }
451 
452  // yzx
453  template<typename T, qualifier Q>
454  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yzx(const glm::vec<3, T, Q> &v) {
455  return glm::vec<3, T, Q>(v.y, v.z, v.x);
456  }
457 
458  template<typename T, qualifier Q>
459  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yzx(const glm::vec<4, T, Q> &v) {
460  return glm::vec<3, T, Q>(v.y, v.z, v.x);
461  }
462 
463  // yzy
464  template<typename T, qualifier Q>
465  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yzy(const glm::vec<3, T, Q> &v) {
466  return glm::vec<3, T, Q>(v.y, v.z, v.y);
467  }
468 
469  template<typename T, qualifier Q>
470  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yzy(const glm::vec<4, T, Q> &v) {
471  return glm::vec<3, T, Q>(v.y, v.z, v.y);
472  }
473 
474  // yzz
475  template<typename T, qualifier Q>
476  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yzz(const glm::vec<3, T, Q> &v) {
477  return glm::vec<3, T, Q>(v.y, v.z, v.z);
478  }
479 
480  template<typename T, qualifier Q>
481  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yzz(const glm::vec<4, T, Q> &v) {
482  return glm::vec<3, T, Q>(v.y, v.z, v.z);
483  }
484 
485  // yzw
486  template<typename T, qualifier Q>
487  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yzw(const glm::vec<4, T, Q> &v) {
488  return glm::vec<3, T, Q>(v.y, v.z, v.w);
489  }
490 
491  // ywx
492  template<typename T, qualifier Q>
493  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> ywx(const glm::vec<4, T, Q> &v) {
494  return glm::vec<3, T, Q>(v.y, v.w, v.x);
495  }
496 
497  // ywy
498  template<typename T, qualifier Q>
499  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> ywy(const glm::vec<4, T, Q> &v) {
500  return glm::vec<3, T, Q>(v.y, v.w, v.y);
501  }
502 
503  // ywz
504  template<typename T, qualifier Q>
505  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> ywz(const glm::vec<4, T, Q> &v) {
506  return glm::vec<3, T, Q>(v.y, v.w, v.z);
507  }
508 
509  // yww
510  template<typename T, qualifier Q>
511  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> yww(const glm::vec<4, T, Q> &v) {
512  return glm::vec<3, T, Q>(v.y, v.w, v.w);
513  }
514 
515  // zxx
516  template<typename T, qualifier Q>
517  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zxx(const glm::vec<3, T, Q> &v) {
518  return glm::vec<3, T, Q>(v.z, v.x, v.x);
519  }
520 
521  template<typename T, qualifier Q>
522  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zxx(const glm::vec<4, T, Q> &v) {
523  return glm::vec<3, T, Q>(v.z, v.x, v.x);
524  }
525 
526  // zxy
527  template<typename T, qualifier Q>
528  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zxy(const glm::vec<3, T, Q> &v) {
529  return glm::vec<3, T, Q>(v.z, v.x, v.y);
530  }
531 
532  template<typename T, qualifier Q>
533  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zxy(const glm::vec<4, T, Q> &v) {
534  return glm::vec<3, T, Q>(v.z, v.x, v.y);
535  }
536 
537  // zxz
538  template<typename T, qualifier Q>
539  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zxz(const glm::vec<3, T, Q> &v) {
540  return glm::vec<3, T, Q>(v.z, v.x, v.z);
541  }
542 
543  template<typename T, qualifier Q>
544  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zxz(const glm::vec<4, T, Q> &v) {
545  return glm::vec<3, T, Q>(v.z, v.x, v.z);
546  }
547 
548  // zxw
549  template<typename T, qualifier Q>
550  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zxw(const glm::vec<4, T, Q> &v) {
551  return glm::vec<3, T, Q>(v.z, v.x, v.w);
552  }
553 
554  // zyx
555  template<typename T, qualifier Q>
556  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zyx(const glm::vec<3, T, Q> &v) {
557  return glm::vec<3, T, Q>(v.z, v.y, v.x);
558  }
559 
560  template<typename T, qualifier Q>
561  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zyx(const glm::vec<4, T, Q> &v) {
562  return glm::vec<3, T, Q>(v.z, v.y, v.x);
563  }
564 
565  // zyy
566  template<typename T, qualifier Q>
567  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zyy(const glm::vec<3, T, Q> &v) {
568  return glm::vec<3, T, Q>(v.z, v.y, v.y);
569  }
570 
571  template<typename T, qualifier Q>
572  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zyy(const glm::vec<4, T, Q> &v) {
573  return glm::vec<3, T, Q>(v.z, v.y, v.y);
574  }
575 
576  // zyz
577  template<typename T, qualifier Q>
578  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zyz(const glm::vec<3, T, Q> &v) {
579  return glm::vec<3, T, Q>(v.z, v.y, v.z);
580  }
581 
582  template<typename T, qualifier Q>
583  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zyz(const glm::vec<4, T, Q> &v) {
584  return glm::vec<3, T, Q>(v.z, v.y, v.z);
585  }
586 
587  // zyw
588  template<typename T, qualifier Q>
589  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zyw(const glm::vec<4, T, Q> &v) {
590  return glm::vec<3, T, Q>(v.z, v.y, v.w);
591  }
592 
593  // zzx
594  template<typename T, qualifier Q>
595  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zzx(const glm::vec<3, T, Q> &v) {
596  return glm::vec<3, T, Q>(v.z, v.z, v.x);
597  }
598 
599  template<typename T, qualifier Q>
600  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zzx(const glm::vec<4, T, Q> &v) {
601  return glm::vec<3, T, Q>(v.z, v.z, v.x);
602  }
603 
604  // zzy
605  template<typename T, qualifier Q>
606  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zzy(const glm::vec<3, T, Q> &v) {
607  return glm::vec<3, T, Q>(v.z, v.z, v.y);
608  }
609 
610  template<typename T, qualifier Q>
611  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zzy(const glm::vec<4, T, Q> &v) {
612  return glm::vec<3, T, Q>(v.z, v.z, v.y);
613  }
614 
615  // zzz
616  template<typename T, qualifier Q>
617  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zzz(const glm::vec<3, T, Q> &v) {
618  return glm::vec<3, T, Q>(v.z, v.z, v.z);
619  }
620 
621  template<typename T, qualifier Q>
622  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zzz(const glm::vec<4, T, Q> &v) {
623  return glm::vec<3, T, Q>(v.z, v.z, v.z);
624  }
625 
626  // zzw
627  template<typename T, qualifier Q>
628  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zzw(const glm::vec<4, T, Q> &v) {
629  return glm::vec<3, T, Q>(v.z, v.z, v.w);
630  }
631 
632  // zwx
633  template<typename T, qualifier Q>
634  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zwx(const glm::vec<4, T, Q> &v) {
635  return glm::vec<3, T, Q>(v.z, v.w, v.x);
636  }
637 
638  // zwy
639  template<typename T, qualifier Q>
640  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zwy(const glm::vec<4, T, Q> &v) {
641  return glm::vec<3, T, Q>(v.z, v.w, v.y);
642  }
643 
644  // zwz
645  template<typename T, qualifier Q>
646  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zwz(const glm::vec<4, T, Q> &v) {
647  return glm::vec<3, T, Q>(v.z, v.w, v.z);
648  }
649 
650  // zww
651  template<typename T, qualifier Q>
652  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> zww(const glm::vec<4, T, Q> &v) {
653  return glm::vec<3, T, Q>(v.z, v.w, v.w);
654  }
655 
656  // wxx
657  template<typename T, qualifier Q>
658  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wxx(const glm::vec<4, T, Q> &v) {
659  return glm::vec<3, T, Q>(v.w, v.x, v.x);
660  }
661 
662  // wxy
663  template<typename T, qualifier Q>
664  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wxy(const glm::vec<4, T, Q> &v) {
665  return glm::vec<3, T, Q>(v.w, v.x, v.y);
666  }
667 
668  // wxz
669  template<typename T, qualifier Q>
670  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wxz(const glm::vec<4, T, Q> &v) {
671  return glm::vec<3, T, Q>(v.w, v.x, v.z);
672  }
673 
674  // wxw
675  template<typename T, qualifier Q>
676  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wxw(const glm::vec<4, T, Q> &v) {
677  return glm::vec<3, T, Q>(v.w, v.x, v.w);
678  }
679 
680  // wyx
681  template<typename T, qualifier Q>
682  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wyx(const glm::vec<4, T, Q> &v) {
683  return glm::vec<3, T, Q>(v.w, v.y, v.x);
684  }
685 
686  // wyy
687  template<typename T, qualifier Q>
688  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wyy(const glm::vec<4, T, Q> &v) {
689  return glm::vec<3, T, Q>(v.w, v.y, v.y);
690  }
691 
692  // wyz
693  template<typename T, qualifier Q>
694  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wyz(const glm::vec<4, T, Q> &v) {
695  return glm::vec<3, T, Q>(v.w, v.y, v.z);
696  }
697 
698  // wyw
699  template<typename T, qualifier Q>
700  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wyw(const glm::vec<4, T, Q> &v) {
701  return glm::vec<3, T, Q>(v.w, v.y, v.w);
702  }
703 
704  // wzx
705  template<typename T, qualifier Q>
706  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wzx(const glm::vec<4, T, Q> &v) {
707  return glm::vec<3, T, Q>(v.w, v.z, v.x);
708  }
709 
710  // wzy
711  template<typename T, qualifier Q>
712  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wzy(const glm::vec<4, T, Q> &v) {
713  return glm::vec<3, T, Q>(v.w, v.z, v.y);
714  }
715 
716  // wzz
717  template<typename T, qualifier Q>
718  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wzz(const glm::vec<4, T, Q> &v) {
719  return glm::vec<3, T, Q>(v.w, v.z, v.z);
720  }
721 
722  // wzw
723  template<typename T, qualifier Q>
724  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wzw(const glm::vec<4, T, Q> &v) {
725  return glm::vec<3, T, Q>(v.w, v.z, v.w);
726  }
727 
728  // wwx
729  template<typename T, qualifier Q>
730  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wwx(const glm::vec<4, T, Q> &v) {
731  return glm::vec<3, T, Q>(v.w, v.w, v.x);
732  }
733 
734  // wwy
735  template<typename T, qualifier Q>
736  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wwy(const glm::vec<4, T, Q> &v) {
737  return glm::vec<3, T, Q>(v.w, v.w, v.y);
738  }
739 
740  // wwz
741  template<typename T, qualifier Q>
742  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> wwz(const glm::vec<4, T, Q> &v) {
743  return glm::vec<3, T, Q>(v.w, v.w, v.z);
744  }
745 
746  // www
747  template<typename T, qualifier Q>
748  GLM_FUNC_QUALIFIER glm::vec<3, T, Q> www(const glm::vec<4, T, Q> &v) {
749  return glm::vec<3, T, Q>(v.w, v.w, v.w);
750  }
751 
752  // xxxx
753  template<typename T, qualifier Q>
754  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxxx(const glm::vec<1, T, Q> &v) {
755  return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);
756  }
757 
758  template<typename T, qualifier Q>
759  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxxx(const glm::vec<2, T, Q> &v) {
760  return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);
761  }
762 
763  template<typename T, qualifier Q>
764  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxxx(const glm::vec<3, T, Q> &v) {
765  return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);
766  }
767 
768  template<typename T, qualifier Q>
769  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxxx(const glm::vec<4, T, Q> &v) {
770  return glm::vec<4, T, Q>(v.x, v.x, v.x, v.x);
771  }
772 
773  // xxxy
774  template<typename T, qualifier Q>
775  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxxy(const glm::vec<2, T, Q> &v) {
776  return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y);
777  }
778 
779  template<typename T, qualifier Q>
780  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxxy(const glm::vec<3, T, Q> &v) {
781  return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y);
782  }
783 
784  template<typename T, qualifier Q>
785  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxxy(const glm::vec<4, T, Q> &v) {
786  return glm::vec<4, T, Q>(v.x, v.x, v.x, v.y);
787  }
788 
789  // xxxz
790  template<typename T, qualifier Q>
791  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxxz(const glm::vec<3, T, Q> &v) {
792  return glm::vec<4, T, Q>(v.x, v.x, v.x, v.z);
793  }
794 
795  template<typename T, qualifier Q>
796  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxxz(const glm::vec<4, T, Q> &v) {
797  return glm::vec<4, T, Q>(v.x, v.x, v.x, v.z);
798  }
799 
800  // xxxw
801  template<typename T, qualifier Q>
802  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxxw(const glm::vec<4, T, Q> &v) {
803  return glm::vec<4, T, Q>(v.x, v.x, v.x, v.w);
804  }
805 
806  // xxyx
807  template<typename T, qualifier Q>
808  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxyx(const glm::vec<2, T, Q> &v) {
809  return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x);
810  }
811 
812  template<typename T, qualifier Q>
813  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxyx(const glm::vec<3, T, Q> &v) {
814  return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x);
815  }
816 
817  template<typename T, qualifier Q>
818  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxyx(const glm::vec<4, T, Q> &v) {
819  return glm::vec<4, T, Q>(v.x, v.x, v.y, v.x);
820  }
821 
822  // xxyy
823  template<typename T, qualifier Q>
824  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxyy(const glm::vec<2, T, Q> &v) {
825  return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y);
826  }
827 
828  template<typename T, qualifier Q>
829  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxyy(const glm::vec<3, T, Q> &v) {
830  return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y);
831  }
832 
833  template<typename T, qualifier Q>
834  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxyy(const glm::vec<4, T, Q> &v) {
835  return glm::vec<4, T, Q>(v.x, v.x, v.y, v.y);
836  }
837 
838  // xxyz
839  template<typename T, qualifier Q>
840  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxyz(const glm::vec<3, T, Q> &v) {
841  return glm::vec<4, T, Q>(v.x, v.x, v.y, v.z);
842  }
843 
844  template<typename T, qualifier Q>
845  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxyz(const glm::vec<4, T, Q> &v) {
846  return glm::vec<4, T, Q>(v.x, v.x, v.y, v.z);
847  }
848 
849  // xxyw
850  template<typename T, qualifier Q>
851  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxyw(const glm::vec<4, T, Q> &v) {
852  return glm::vec<4, T, Q>(v.x, v.x, v.y, v.w);
853  }
854 
855  // xxzx
856  template<typename T, qualifier Q>
857  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxzx(const glm::vec<3, T, Q> &v) {
858  return glm::vec<4, T, Q>(v.x, v.x, v.z, v.x);
859  }
860 
861  template<typename T, qualifier Q>
862  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxzx(const glm::vec<4, T, Q> &v) {
863  return glm::vec<4, T, Q>(v.x, v.x, v.z, v.x);
864  }
865 
866  // xxzy
867  template<typename T, qualifier Q>
868  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxzy(const glm::vec<3, T, Q> &v) {
869  return glm::vec<4, T, Q>(v.x, v.x, v.z, v.y);
870  }
871 
872  template<typename T, qualifier Q>
873  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxzy(const glm::vec<4, T, Q> &v) {
874  return glm::vec<4, T, Q>(v.x, v.x, v.z, v.y);
875  }
876 
877  // xxzz
878  template<typename T, qualifier Q>
879  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxzz(const glm::vec<3, T, Q> &v) {
880  return glm::vec<4, T, Q>(v.x, v.x, v.z, v.z);
881  }
882 
883  template<typename T, qualifier Q>
884  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxzz(const glm::vec<4, T, Q> &v) {
885  return glm::vec<4, T, Q>(v.x, v.x, v.z, v.z);
886  }
887 
888  // xxzw
889  template<typename T, qualifier Q>
890  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxzw(const glm::vec<4, T, Q> &v) {
891  return glm::vec<4, T, Q>(v.x, v.x, v.z, v.w);
892  }
893 
894  // xxwx
895  template<typename T, qualifier Q>
896  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxwx(const glm::vec<4, T, Q> &v) {
897  return glm::vec<4, T, Q>(v.x, v.x, v.w, v.x);
898  }
899 
900  // xxwy
901  template<typename T, qualifier Q>
902  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxwy(const glm::vec<4, T, Q> &v) {
903  return glm::vec<4, T, Q>(v.x, v.x, v.w, v.y);
904  }
905 
906  // xxwz
907  template<typename T, qualifier Q>
908  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxwz(const glm::vec<4, T, Q> &v) {
909  return glm::vec<4, T, Q>(v.x, v.x, v.w, v.z);
910  }
911 
912  // xxww
913  template<typename T, qualifier Q>
914  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xxww(const glm::vec<4, T, Q> &v) {
915  return glm::vec<4, T, Q>(v.x, v.x, v.w, v.w);
916  }
917 
918  // xyxx
919  template<typename T, qualifier Q>
920  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyxx(const glm::vec<2, T, Q> &v) {
921  return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x);
922  }
923 
924  template<typename T, qualifier Q>
925  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyxx(const glm::vec<3, T, Q> &v) {
926  return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x);
927  }
928 
929  template<typename T, qualifier Q>
930  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyxx(const glm::vec<4, T, Q> &v) {
931  return glm::vec<4, T, Q>(v.x, v.y, v.x, v.x);
932  }
933 
934  // xyxy
935  template<typename T, qualifier Q>
936  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyxy(const glm::vec<2, T, Q> &v) {
937  return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y);
938  }
939 
940  template<typename T, qualifier Q>
941  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyxy(const glm::vec<3, T, Q> &v) {
942  return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y);
943  }
944 
945  template<typename T, qualifier Q>
946  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyxy(const glm::vec<4, T, Q> &v) {
947  return glm::vec<4, T, Q>(v.x, v.y, v.x, v.y);
948  }
949 
950  // xyxz
951  template<typename T, qualifier Q>
952  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyxz(const glm::vec<3, T, Q> &v) {
953  return glm::vec<4, T, Q>(v.x, v.y, v.x, v.z);
954  }
955 
956  template<typename T, qualifier Q>
957  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyxz(const glm::vec<4, T, Q> &v) {
958  return glm::vec<4, T, Q>(v.x, v.y, v.x, v.z);
959  }
960 
961  // xyxw
962  template<typename T, qualifier Q>
963  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyxw(const glm::vec<4, T, Q> &v) {
964  return glm::vec<4, T, Q>(v.x, v.y, v.x, v.w);
965  }
966 
967  // xyyx
968  template<typename T, qualifier Q>
969  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyyx(const glm::vec<2, T, Q> &v) {
970  return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x);
971  }
972 
973  template<typename T, qualifier Q>
974  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyyx(const glm::vec<3, T, Q> &v) {
975  return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x);
976  }
977 
978  template<typename T, qualifier Q>
979  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyyx(const glm::vec<4, T, Q> &v) {
980  return glm::vec<4, T, Q>(v.x, v.y, v.y, v.x);
981  }
982 
983  // xyyy
984  template<typename T, qualifier Q>
985  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyyy(const glm::vec<2, T, Q> &v) {
986  return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y);
987  }
988 
989  template<typename T, qualifier Q>
990  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyyy(const glm::vec<3, T, Q> &v) {
991  return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y);
992  }
993 
994  template<typename T, qualifier Q>
995  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyyy(const glm::vec<4, T, Q> &v) {
996  return glm::vec<4, T, Q>(v.x, v.y, v.y, v.y);
997  }
998 
999  // xyyz
1000  template<typename T, qualifier Q>
1001  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyyz(const glm::vec<3, T, Q> &v) {
1002  return glm::vec<4, T, Q>(v.x, v.y, v.y, v.z);
1003  }
1004 
1005  template<typename T, qualifier Q>
1006  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyyz(const glm::vec<4, T, Q> &v) {
1007  return glm::vec<4, T, Q>(v.x, v.y, v.y, v.z);
1008  }
1009 
1010  // xyyw
1011  template<typename T, qualifier Q>
1012  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyyw(const glm::vec<4, T, Q> &v) {
1013  return glm::vec<4, T, Q>(v.x, v.y, v.y, v.w);
1014  }
1015 
1016  // xyzx
1017  template<typename T, qualifier Q>
1018  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyzx(const glm::vec<3, T, Q> &v) {
1019  return glm::vec<4, T, Q>(v.x, v.y, v.z, v.x);
1020  }
1021 
1022  template<typename T, qualifier Q>
1023  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyzx(const glm::vec<4, T, Q> &v) {
1024  return glm::vec<4, T, Q>(v.x, v.y, v.z, v.x);
1025  }
1026 
1027  // xyzy
1028  template<typename T, qualifier Q>
1029  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyzy(const glm::vec<3, T, Q> &v) {
1030  return glm::vec<4, T, Q>(v.x, v.y, v.z, v.y);
1031  }
1032 
1033  template<typename T, qualifier Q>
1034  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyzy(const glm::vec<4, T, Q> &v) {
1035  return glm::vec<4, T, Q>(v.x, v.y, v.z, v.y);
1036  }
1037 
1038 
1039  // xyzw
1040  template<typename T, qualifier Q>
1041  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyzw(const glm::vec<4, T, Q> &v) {
1042  return glm::vec<4, T, Q>(v.x, v.y, v.z, v.w);
1043  }
1044 
1045  // xywx
1046  template<typename T, qualifier Q>
1047  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xywx(const glm::vec<4, T, Q> &v) {
1048  return glm::vec<4, T, Q>(v.x, v.y, v.w, v.x);
1049  }
1050 
1051  // xywy
1052  template<typename T, qualifier Q>
1053  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xywy(const glm::vec<4, T, Q> &v) {
1054  return glm::vec<4, T, Q>(v.x, v.y, v.w, v.y);
1055  }
1056 
1057  // xywz
1058  template<typename T, qualifier Q>
1059  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xywz(const glm::vec<4, T, Q> &v) {
1060  return glm::vec<4, T, Q>(v.x, v.y, v.w, v.z);
1061  }
1062 
1063  // xyww
1064  template<typename T, qualifier Q>
1065  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xyww(const glm::vec<4, T, Q> &v) {
1066  return glm::vec<4, T, Q>(v.x, v.y, v.w, v.w);
1067  }
1068 
1069  // xzxx
1070  template<typename T, qualifier Q>
1071  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzxx(const glm::vec<3, T, Q> &v) {
1072  return glm::vec<4, T, Q>(v.x, v.z, v.x, v.x);
1073  }
1074 
1075  template<typename T, qualifier Q>
1076  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzxx(const glm::vec<4, T, Q> &v) {
1077  return glm::vec<4, T, Q>(v.x, v.z, v.x, v.x);
1078  }
1079 
1080  // xzxy
1081  template<typename T, qualifier Q>
1082  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzxy(const glm::vec<3, T, Q> &v) {
1083  return glm::vec<4, T, Q>(v.x, v.z, v.x, v.y);
1084  }
1085 
1086  template<typename T, qualifier Q>
1087  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzxy(const glm::vec<4, T, Q> &v) {
1088  return glm::vec<4, T, Q>(v.x, v.z, v.x, v.y);
1089  }
1090 
1091  // xzxz
1092  template<typename T, qualifier Q>
1093  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzxz(const glm::vec<3, T, Q> &v) {
1094  return glm::vec<4, T, Q>(v.x, v.z, v.x, v.z);
1095  }
1096 
1097  template<typename T, qualifier Q>
1098  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzxz(const glm::vec<4, T, Q> &v) {
1099  return glm::vec<4, T, Q>(v.x, v.z, v.x, v.z);
1100  }
1101 
1102  // xzxw
1103  template<typename T, qualifier Q>
1104  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzxw(const glm::vec<4, T, Q> &v) {
1105  return glm::vec<4, T, Q>(v.x, v.z, v.x, v.w);
1106  }
1107 
1108  // xzyx
1109  template<typename T, qualifier Q>
1110  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzyx(const glm::vec<3, T, Q> &v) {
1111  return glm::vec<4, T, Q>(v.x, v.z, v.y, v.x);
1112  }
1113 
1114  template<typename T, qualifier Q>
1115  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzyx(const glm::vec<4, T, Q> &v) {
1116  return glm::vec<4, T, Q>(v.x, v.z, v.y, v.x);
1117  }
1118 
1119  // xzyy
1120  template<typename T, qualifier Q>
1121  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzyy(const glm::vec<3, T, Q> &v) {
1122  return glm::vec<4, T, Q>(v.x, v.z, v.y, v.y);
1123  }
1124 
1125  template<typename T, qualifier Q>
1126  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzyy(const glm::vec<4, T, Q> &v) {
1127  return glm::vec<4, T, Q>(v.x, v.z, v.y, v.y);
1128  }
1129 
1130  // xzyz
1131  template<typename T, qualifier Q>
1132  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzyz(const glm::vec<3, T, Q> &v) {
1133  return glm::vec<4, T, Q>(v.x, v.z, v.y, v.z);
1134  }
1135 
1136  template<typename T, qualifier Q>
1137  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzyz(const glm::vec<4, T, Q> &v) {
1138  return glm::vec<4, T, Q>(v.x, v.z, v.y, v.z);
1139  }
1140 
1141  // xzyw
1142  template<typename T, qualifier Q>
1143  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzyw(const glm::vec<4, T, Q> &v) {
1144  return glm::vec<4, T, Q>(v.x, v.z, v.y, v.w);
1145  }
1146 
1147  // xzzx
1148  template<typename T, qualifier Q>
1149  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzzx(const glm::vec<3, T, Q> &v) {
1150  return glm::vec<4, T, Q>(v.x, v.z, v.z, v.x);
1151  }
1152 
1153  template<typename T, qualifier Q>
1154  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzzx(const glm::vec<4, T, Q> &v) {
1155  return glm::vec<4, T, Q>(v.x, v.z, v.z, v.x);
1156  }
1157 
1158  // xzzy
1159  template<typename T, qualifier Q>
1160  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzzy(const glm::vec<3, T, Q> &v) {
1161  return glm::vec<4, T, Q>(v.x, v.z, v.z, v.y);
1162  }
1163 
1164  template<typename T, qualifier Q>
1165  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzzy(const glm::vec<4, T, Q> &v) {
1166  return glm::vec<4, T, Q>(v.x, v.z, v.z, v.y);
1167  }
1168 
1169  // xzzz
1170  template<typename T, qualifier Q>
1171  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzzz(const glm::vec<3, T, Q> &v) {
1172  return glm::vec<4, T, Q>(v.x, v.z, v.z, v.z);
1173  }
1174 
1175  template<typename T, qualifier Q>
1176  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzzz(const glm::vec<4, T, Q> &v) {
1177  return glm::vec<4, T, Q>(v.x, v.z, v.z, v.z);
1178  }
1179 
1180  // xzzw
1181  template<typename T, qualifier Q>
1182  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzzw(const glm::vec<4, T, Q> &v) {
1183  return glm::vec<4, T, Q>(v.x, v.z, v.z, v.w);
1184  }
1185 
1186  // xzwx
1187  template<typename T, qualifier Q>
1188  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzwx(const glm::vec<4, T, Q> &v) {
1189  return glm::vec<4, T, Q>(v.x, v.z, v.w, v.x);
1190  }
1191 
1192  // xzwy
1193  template<typename T, qualifier Q>
1194  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzwy(const glm::vec<4, T, Q> &v) {
1195  return glm::vec<4, T, Q>(v.x, v.z, v.w, v.y);
1196  }
1197 
1198  // xzwz
1199  template<typename T, qualifier Q>
1200  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzwz(const glm::vec<4, T, Q> &v) {
1201  return glm::vec<4, T, Q>(v.x, v.z, v.w, v.z);
1202  }
1203 
1204  // xzww
1205  template<typename T, qualifier Q>
1206  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xzww(const glm::vec<4, T, Q> &v) {
1207  return glm::vec<4, T, Q>(v.x, v.z, v.w, v.w);
1208  }
1209 
1210  // xwxx
1211  template<typename T, qualifier Q>
1212  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwxx(const glm::vec<4, T, Q> &v) {
1213  return glm::vec<4, T, Q>(v.x, v.w, v.x, v.x);
1214  }
1215 
1216  // xwxy
1217  template<typename T, qualifier Q>
1218  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwxy(const glm::vec<4, T, Q> &v) {
1219  return glm::vec<4, T, Q>(v.x, v.w, v.x, v.y);
1220  }
1221 
1222  // xwxz
1223  template<typename T, qualifier Q>
1224  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwxz(const glm::vec<4, T, Q> &v) {
1225  return glm::vec<4, T, Q>(v.x, v.w, v.x, v.z);
1226  }
1227 
1228  // xwxw
1229  template<typename T, qualifier Q>
1230  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwxw(const glm::vec<4, T, Q> &v) {
1231  return glm::vec<4, T, Q>(v.x, v.w, v.x, v.w);
1232  }
1233 
1234  // xwyx
1235  template<typename T, qualifier Q>
1236  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwyx(const glm::vec<4, T, Q> &v) {
1237  return glm::vec<4, T, Q>(v.x, v.w, v.y, v.x);
1238  }
1239 
1240  // xwyy
1241  template<typename T, qualifier Q>
1242  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwyy(const glm::vec<4, T, Q> &v) {
1243  return glm::vec<4, T, Q>(v.x, v.w, v.y, v.y);
1244  }
1245 
1246  // xwyz
1247  template<typename T, qualifier Q>
1248  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwyz(const glm::vec<4, T, Q> &v) {
1249  return glm::vec<4, T, Q>(v.x, v.w, v.y, v.z);
1250  }
1251 
1252  // xwyw
1253  template<typename T, qualifier Q>
1254  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwyw(const glm::vec<4, T, Q> &v) {
1255  return glm::vec<4, T, Q>(v.x, v.w, v.y, v.w);
1256  }
1257 
1258  // xwzx
1259  template<typename T, qualifier Q>
1260  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwzx(const glm::vec<4, T, Q> &v) {
1261  return glm::vec<4, T, Q>(v.x, v.w, v.z, v.x);
1262  }
1263 
1264  // xwzy
1265  template<typename T, qualifier Q>
1266  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwzy(const glm::vec<4, T, Q> &v) {
1267  return glm::vec<4, T, Q>(v.x, v.w, v.z, v.y);
1268  }
1269 
1270  // xwzz
1271  template<typename T, qualifier Q>
1272  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwzz(const glm::vec<4, T, Q> &v) {
1273  return glm::vec<4, T, Q>(v.x, v.w, v.z, v.z);
1274  }
1275 
1276  // xwzw
1277  template<typename T, qualifier Q>
1278  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwzw(const glm::vec<4, T, Q> &v) {
1279  return glm::vec<4, T, Q>(v.x, v.w, v.z, v.w);
1280  }
1281 
1282  // xwwx
1283  template<typename T, qualifier Q>
1284  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwwx(const glm::vec<4, T, Q> &v) {
1285  return glm::vec<4, T, Q>(v.x, v.w, v.w, v.x);
1286  }
1287 
1288  // xwwy
1289  template<typename T, qualifier Q>
1290  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwwy(const glm::vec<4, T, Q> &v) {
1291  return glm::vec<4, T, Q>(v.x, v.w, v.w, v.y);
1292  }
1293 
1294  // xwwz
1295  template<typename T, qualifier Q>
1296  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwwz(const glm::vec<4, T, Q> &v) {
1297  return glm::vec<4, T, Q>(v.x, v.w, v.w, v.z);
1298  }
1299 
1300  // xwww
1301  template<typename T, qualifier Q>
1302  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> xwww(const glm::vec<4, T, Q> &v) {
1303  return glm::vec<4, T, Q>(v.x, v.w, v.w, v.w);
1304  }
1305 
1306  // yxxx
1307  template<typename T, qualifier Q>
1308  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxxx(const glm::vec<2, T, Q> &v) {
1309  return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x);
1310  }
1311 
1312  template<typename T, qualifier Q>
1313  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxxx(const glm::vec<3, T, Q> &v) {
1314  return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x);
1315  }
1316 
1317  template<typename T, qualifier Q>
1318  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxxx(const glm::vec<4, T, Q> &v) {
1319  return glm::vec<4, T, Q>(v.y, v.x, v.x, v.x);
1320  }
1321 
1322  // yxxy
1323  template<typename T, qualifier Q>
1324  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxxy(const glm::vec<2, T, Q> &v) {
1325  return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y);
1326  }
1327 
1328  template<typename T, qualifier Q>
1329  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxxy(const glm::vec<3, T, Q> &v) {
1330  return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y);
1331  }
1332 
1333  template<typename T, qualifier Q>
1334  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxxy(const glm::vec<4, T, Q> &v) {
1335  return glm::vec<4, T, Q>(v.y, v.x, v.x, v.y);
1336  }
1337 
1338  // yxxz
1339  template<typename T, qualifier Q>
1340  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxxz(const glm::vec<3, T, Q> &v) {
1341  return glm::vec<4, T, Q>(v.y, v.x, v.x, v.z);
1342  }
1343 
1344  template<typename T, qualifier Q>
1345  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxxz(const glm::vec<4, T, Q> &v) {
1346  return glm::vec<4, T, Q>(v.y, v.x, v.x, v.z);
1347  }
1348 
1349  // yxxw
1350  template<typename T, qualifier Q>
1351  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxxw(const glm::vec<4, T, Q> &v) {
1352  return glm::vec<4, T, Q>(v.y, v.x, v.x, v.w);
1353  }
1354 
1355  // yxyx
1356  template<typename T, qualifier Q>
1357  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxyx(const glm::vec<2, T, Q> &v) {
1358  return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x);
1359  }
1360 
1361  template<typename T, qualifier Q>
1362  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxyx(const glm::vec<3, T, Q> &v) {
1363  return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x);
1364  }
1365 
1366  template<typename T, qualifier Q>
1367  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxyx(const glm::vec<4, T, Q> &v) {
1368  return glm::vec<4, T, Q>(v.y, v.x, v.y, v.x);
1369  }
1370 
1371  // yxyy
1372  template<typename T, qualifier Q>
1373  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxyy(const glm::vec<2, T, Q> &v) {
1374  return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y);
1375  }
1376 
1377  template<typename T, qualifier Q>
1378  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxyy(const glm::vec<3, T, Q> &v) {
1379  return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y);
1380  }
1381 
1382  template<typename T, qualifier Q>
1383  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxyy(const glm::vec<4, T, Q> &v) {
1384  return glm::vec<4, T, Q>(v.y, v.x, v.y, v.y);
1385  }
1386 
1387  // yxyz
1388  template<typename T, qualifier Q>
1389  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxyz(const glm::vec<3, T, Q> &v) {
1390  return glm::vec<4, T, Q>(v.y, v.x, v.y, v.z);
1391  }
1392 
1393  template<typename T, qualifier Q>
1394  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxyz(const glm::vec<4, T, Q> &v) {
1395  return glm::vec<4, T, Q>(v.y, v.x, v.y, v.z);
1396  }
1397 
1398  // yxyw
1399  template<typename T, qualifier Q>
1400  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxyw(const glm::vec<4, T, Q> &v) {
1401  return glm::vec<4, T, Q>(v.y, v.x, v.y, v.w);
1402  }
1403 
1404  // yxzx
1405  template<typename T, qualifier Q>
1406  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxzx(const glm::vec<3, T, Q> &v) {
1407  return glm::vec<4, T, Q>(v.y, v.x, v.z, v.x);
1408  }
1409 
1410  template<typename T, qualifier Q>
1411  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxzx(const glm::vec<4, T, Q> &v) {
1412  return glm::vec<4, T, Q>(v.y, v.x, v.z, v.x);
1413  }
1414 
1415  // yxzy
1416  template<typename T, qualifier Q>
1417  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxzy(const glm::vec<3, T, Q> &v) {
1418  return glm::vec<4, T, Q>(v.y, v.x, v.z, v.y);
1419  }
1420 
1421  template<typename T, qualifier Q>
1422  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxzy(const glm::vec<4, T, Q> &v) {
1423  return glm::vec<4, T, Q>(v.y, v.x, v.z, v.y);
1424  }
1425 
1426  // yxzz
1427  template<typename T, qualifier Q>
1428  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxzz(const glm::vec<3, T, Q> &v) {
1429  return glm::vec<4, T, Q>(v.y, v.x, v.z, v.z);
1430  }
1431 
1432  template<typename T, qualifier Q>
1433  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxzz(const glm::vec<4, T, Q> &v) {
1434  return glm::vec<4, T, Q>(v.y, v.x, v.z, v.z);
1435  }
1436 
1437  // yxzw
1438  template<typename T, qualifier Q>
1439  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxzw(const glm::vec<4, T, Q> &v) {
1440  return glm::vec<4, T, Q>(v.y, v.x, v.z, v.w);
1441  }
1442 
1443  // yxwx
1444  template<typename T, qualifier Q>
1445  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxwx(const glm::vec<4, T, Q> &v) {
1446  return glm::vec<4, T, Q>(v.y, v.x, v.w, v.x);
1447  }
1448 
1449  // yxwy
1450  template<typename T, qualifier Q>
1451  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxwy(const glm::vec<4, T, Q> &v) {
1452  return glm::vec<4, T, Q>(v.y, v.x, v.w, v.y);
1453  }
1454 
1455  // yxwz
1456  template<typename T, qualifier Q>
1457  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxwz(const glm::vec<4, T, Q> &v) {
1458  return glm::vec<4, T, Q>(v.y, v.x, v.w, v.z);
1459  }
1460 
1461  // yxww
1462  template<typename T, qualifier Q>
1463  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yxww(const glm::vec<4, T, Q> &v) {
1464  return glm::vec<4, T, Q>(v.y, v.x, v.w, v.w);
1465  }
1466 
1467  // yyxx
1468  template<typename T, qualifier Q>
1469  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyxx(const glm::vec<2, T, Q> &v) {
1470  return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x);
1471  }
1472 
1473  template<typename T, qualifier Q>
1474  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyxx(const glm::vec<3, T, Q> &v) {
1475  return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x);
1476  }
1477 
1478  template<typename T, qualifier Q>
1479  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyxx(const glm::vec<4, T, Q> &v) {
1480  return glm::vec<4, T, Q>(v.y, v.y, v.x, v.x);
1481  }
1482 
1483  // yyxy
1484  template<typename T, qualifier Q>
1485  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyxy(const glm::vec<2, T, Q> &v) {
1486  return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y);
1487  }
1488 
1489  template<typename T, qualifier Q>
1490  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyxy(const glm::vec<3, T, Q> &v) {
1491  return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y);
1492  }
1493 
1494  template<typename T, qualifier Q>
1495  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyxy(const glm::vec<4, T, Q> &v) {
1496  return glm::vec<4, T, Q>(v.y, v.y, v.x, v.y);
1497  }
1498 
1499  // yyxz
1500  template<typename T, qualifier Q>
1501  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyxz(const glm::vec<3, T, Q> &v) {
1502  return glm::vec<4, T, Q>(v.y, v.y, v.x, v.z);
1503  }
1504 
1505  template<typename T, qualifier Q>
1506  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyxz(const glm::vec<4, T, Q> &v) {
1507  return glm::vec<4, T, Q>(v.y, v.y, v.x, v.z);
1508  }
1509 
1510  // yyxw
1511  template<typename T, qualifier Q>
1512  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyxw(const glm::vec<4, T, Q> &v) {
1513  return glm::vec<4, T, Q>(v.y, v.y, v.x, v.w);
1514  }
1515 
1516  // yyyx
1517  template<typename T, qualifier Q>
1518  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyyx(const glm::vec<2, T, Q> &v) {
1519  return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x);
1520  }
1521 
1522  template<typename T, qualifier Q>
1523  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyyx(const glm::vec<3, T, Q> &v) {
1524  return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x);
1525  }
1526 
1527  template<typename T, qualifier Q>
1528  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyyx(const glm::vec<4, T, Q> &v) {
1529  return glm::vec<4, T, Q>(v.y, v.y, v.y, v.x);
1530  }
1531 
1532  // yyyy
1533  template<typename T, qualifier Q>
1534  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyyy(const glm::vec<2, T, Q> &v) {
1535  return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y);
1536  }
1537 
1538  template<typename T, qualifier Q>
1539  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyyy(const glm::vec<3, T, Q> &v) {
1540  return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y);
1541  }
1542 
1543  template<typename T, qualifier Q>
1544  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyyy(const glm::vec<4, T, Q> &v) {
1545  return glm::vec<4, T, Q>(v.y, v.y, v.y, v.y);
1546  }
1547 
1548  // yyyz
1549  template<typename T, qualifier Q>
1550  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyyz(const glm::vec<3, T, Q> &v) {
1551  return glm::vec<4, T, Q>(v.y, v.y, v.y, v.z);
1552  }
1553 
1554  template<typename T, qualifier Q>
1555  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyyz(const glm::vec<4, T, Q> &v) {
1556  return glm::vec<4, T, Q>(v.y, v.y, v.y, v.z);
1557  }
1558 
1559  // yyyw
1560  template<typename T, qualifier Q>
1561  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyyw(const glm::vec<4, T, Q> &v) {
1562  return glm::vec<4, T, Q>(v.y, v.y, v.y, v.w);
1563  }
1564 
1565  // yyzx
1566  template<typename T, qualifier Q>
1567  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyzx(const glm::vec<3, T, Q> &v) {
1568  return glm::vec<4, T, Q>(v.y, v.y, v.z, v.x);
1569  }
1570 
1571  template<typename T, qualifier Q>
1572  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyzx(const glm::vec<4, T, Q> &v) {
1573  return glm::vec<4, T, Q>(v.y, v.y, v.z, v.x);
1574  }
1575 
1576  // yyzy
1577  template<typename T, qualifier Q>
1578  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyzy(const glm::vec<3, T, Q> &v) {
1579  return glm::vec<4, T, Q>(v.y, v.y, v.z, v.y);
1580  }
1581 
1582  template<typename T, qualifier Q>
1583  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyzy(const glm::vec<4, T, Q> &v) {
1584  return glm::vec<4, T, Q>(v.y, v.y, v.z, v.y);
1585  }
1586 
1587  // yyzz
1588  template<typename T, qualifier Q>
1589  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyzz(const glm::vec<3, T, Q> &v) {
1590  return glm::vec<4, T, Q>(v.y, v.y, v.z, v.z);
1591  }
1592 
1593  template<typename T, qualifier Q>
1594  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyzz(const glm::vec<4, T, Q> &v) {
1595  return glm::vec<4, T, Q>(v.y, v.y, v.z, v.z);
1596  }
1597 
1598  // yyzw
1599  template<typename T, qualifier Q>
1600  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyzw(const glm::vec<4, T, Q> &v) {
1601  return glm::vec<4, T, Q>(v.y, v.y, v.z, v.w);
1602  }
1603 
1604  // yywx
1605  template<typename T, qualifier Q>
1606  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yywx(const glm::vec<4, T, Q> &v) {
1607  return glm::vec<4, T, Q>(v.y, v.y, v.w, v.x);
1608  }
1609 
1610  // yywy
1611  template<typename T, qualifier Q>
1612  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yywy(const glm::vec<4, T, Q> &v) {
1613  return glm::vec<4, T, Q>(v.y, v.y, v.w, v.y);
1614  }
1615 
1616  // yywz
1617  template<typename T, qualifier Q>
1618  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yywz(const glm::vec<4, T, Q> &v) {
1619  return glm::vec<4, T, Q>(v.y, v.y, v.w, v.z);
1620  }
1621 
1622  // yyww
1623  template<typename T, qualifier Q>
1624  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yyww(const glm::vec<4, T, Q> &v) {
1625  return glm::vec<4, T, Q>(v.y, v.y, v.w, v.w);
1626  }
1627 
1628  // yzxx
1629  template<typename T, qualifier Q>
1630  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzxx(const glm::vec<3, T, Q> &v) {
1631  return glm::vec<4, T, Q>(v.y, v.z, v.x, v.x);
1632  }
1633 
1634  template<typename T, qualifier Q>
1635  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzxx(const glm::vec<4, T, Q> &v) {
1636  return glm::vec<4, T, Q>(v.y, v.z, v.x, v.x);
1637  }
1638 
1639  // yzxy
1640  template<typename T, qualifier Q>
1641  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzxy(const glm::vec<3, T, Q> &v) {
1642  return glm::vec<4, T, Q>(v.y, v.z, v.x, v.y);
1643  }
1644 
1645  template<typename T, qualifier Q>
1646  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzxy(const glm::vec<4, T, Q> &v) {
1647  return glm::vec<4, T, Q>(v.y, v.z, v.x, v.y);
1648  }
1649 
1650  // yzxz
1651  template<typename T, qualifier Q>
1652  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzxz(const glm::vec<3, T, Q> &v) {
1653  return glm::vec<4, T, Q>(v.y, v.z, v.x, v.z);
1654  }
1655 
1656  template<typename T, qualifier Q>
1657  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzxz(const glm::vec<4, T, Q> &v) {
1658  return glm::vec<4, T, Q>(v.y, v.z, v.x, v.z);
1659  }
1660 
1661  // yzxw
1662  template<typename T, qualifier Q>
1663  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzxw(const glm::vec<4, T, Q> &v) {
1664  return glm::vec<4, T, Q>(v.y, v.z, v.x, v.w);
1665  }
1666 
1667  // yzyx
1668  template<typename T, qualifier Q>
1669  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzyx(const glm::vec<3, T, Q> &v) {
1670  return glm::vec<4, T, Q>(v.y, v.z, v.y, v.x);
1671  }
1672 
1673  template<typename T, qualifier Q>
1674  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzyx(const glm::vec<4, T, Q> &v) {
1675  return glm::vec<4, T, Q>(v.y, v.z, v.y, v.x);
1676  }
1677 
1678  // yzyy
1679  template<typename T, qualifier Q>
1680  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzyy(const glm::vec<3, T, Q> &v) {
1681  return glm::vec<4, T, Q>(v.y, v.z, v.y, v.y);
1682  }
1683 
1684  template<typename T, qualifier Q>
1685  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzyy(const glm::vec<4, T, Q> &v) {
1686  return glm::vec<4, T, Q>(v.y, v.z, v.y, v.y);
1687  }
1688 
1689  // yzyz
1690  template<typename T, qualifier Q>
1691  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzyz(const glm::vec<3, T, Q> &v) {
1692  return glm::vec<4, T, Q>(v.y, v.z, v.y, v.z);
1693  }
1694 
1695  template<typename T, qualifier Q>
1696  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzyz(const glm::vec<4, T, Q> &v) {
1697  return glm::vec<4, T, Q>(v.y, v.z, v.y, v.z);
1698  }
1699 
1700  // yzyw
1701  template<typename T, qualifier Q>
1702  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzyw(const glm::vec<4, T, Q> &v) {
1703  return glm::vec<4, T, Q>(v.y, v.z, v.y, v.w);
1704  }
1705 
1706  // yzzx
1707  template<typename T, qualifier Q>
1708  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzzx(const glm::vec<3, T, Q> &v) {
1709  return glm::vec<4, T, Q>(v.y, v.z, v.z, v.x);
1710  }
1711 
1712  template<typename T, qualifier Q>
1713  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzzx(const glm::vec<4, T, Q> &v) {
1714  return glm::vec<4, T, Q>(v.y, v.z, v.z, v.x);
1715  }
1716 
1717  // yzzy
1718  template<typename T, qualifier Q>
1719  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzzy(const glm::vec<3, T, Q> &v) {
1720  return glm::vec<4, T, Q>(v.y, v.z, v.z, v.y);
1721  }
1722 
1723  template<typename T, qualifier Q>
1724  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzzy(const glm::vec<4, T, Q> &v) {
1725  return glm::vec<4, T, Q>(v.y, v.z, v.z, v.y);
1726  }
1727 
1728  // yzzz
1729  template<typename T, qualifier Q>
1730  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzzz(const glm::vec<3, T, Q> &v) {
1731  return glm::vec<4, T, Q>(v.y, v.z, v.z, v.z);
1732  }
1733 
1734  template<typename T, qualifier Q>
1735  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzzz(const glm::vec<4, T, Q> &v) {
1736  return glm::vec<4, T, Q>(v.y, v.z, v.z, v.z);
1737  }
1738 
1739  // yzzw
1740  template<typename T, qualifier Q>
1741  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzzw(const glm::vec<4, T, Q> &v) {
1742  return glm::vec<4, T, Q>(v.y, v.z, v.z, v.w);
1743  }
1744 
1745  // yzwx
1746  template<typename T, qualifier Q>
1747  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzwx(const glm::vec<4, T, Q> &v) {
1748  return glm::vec<4, T, Q>(v.y, v.z, v.w, v.x);
1749  }
1750 
1751  // yzwy
1752  template<typename T, qualifier Q>
1753  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzwy(const glm::vec<4, T, Q> &v) {
1754  return glm::vec<4, T, Q>(v.y, v.z, v.w, v.y);
1755  }
1756 
1757  // yzwz
1758  template<typename T, qualifier Q>
1759  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzwz(const glm::vec<4, T, Q> &v) {
1760  return glm::vec<4, T, Q>(v.y, v.z, v.w, v.z);
1761  }
1762 
1763  // yzww
1764  template<typename T, qualifier Q>
1765  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> yzww(const glm::vec<4, T, Q> &v) {
1766  return glm::vec<4, T, Q>(v.y, v.z, v.w, v.w);
1767  }
1768 
1769  // ywxx
1770  template<typename T, qualifier Q>
1771  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywxx(const glm::vec<4, T, Q> &v) {
1772  return glm::vec<4, T, Q>(v.y, v.w, v.x, v.x);
1773  }
1774 
1775  // ywxy
1776  template<typename T, qualifier Q>
1777  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywxy(const glm::vec<4, T, Q> &v) {
1778  return glm::vec<4, T, Q>(v.y, v.w, v.x, v.y);
1779  }
1780 
1781  // ywxz
1782  template<typename T, qualifier Q>
1783  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywxz(const glm::vec<4, T, Q> &v) {
1784  return glm::vec<4, T, Q>(v.y, v.w, v.x, v.z);
1785  }
1786 
1787  // ywxw
1788  template<typename T, qualifier Q>
1789  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywxw(const glm::vec<4, T, Q> &v) {
1790  return glm::vec<4, T, Q>(v.y, v.w, v.x, v.w);
1791  }
1792 
1793  // ywyx
1794  template<typename T, qualifier Q>
1795  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywyx(const glm::vec<4, T, Q> &v) {
1796  return glm::vec<4, T, Q>(v.y, v.w, v.y, v.x);
1797  }
1798 
1799  // ywyy
1800  template<typename T, qualifier Q>
1801  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywyy(const glm::vec<4, T, Q> &v) {
1802  return glm::vec<4, T, Q>(v.y, v.w, v.y, v.y);
1803  }
1804 
1805  // ywyz
1806  template<typename T, qualifier Q>
1807  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywyz(const glm::vec<4, T, Q> &v) {
1808  return glm::vec<4, T, Q>(v.y, v.w, v.y, v.z);
1809  }
1810 
1811  // ywyw
1812  template<typename T, qualifier Q>
1813  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywyw(const glm::vec<4, T, Q> &v) {
1814  return glm::vec<4, T, Q>(v.y, v.w, v.y, v.w);
1815  }
1816 
1817  // ywzx
1818  template<typename T, qualifier Q>
1819  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywzx(const glm::vec<4, T, Q> &v) {
1820  return glm::vec<4, T, Q>(v.y, v.w, v.z, v.x);
1821  }
1822 
1823  // ywzy
1824  template<typename T, qualifier Q>
1825  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywzy(const glm::vec<4, T, Q> &v) {
1826  return glm::vec<4, T, Q>(v.y, v.w, v.z, v.y);
1827  }
1828 
1829  // ywzz
1830  template<typename T, qualifier Q>
1831  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywzz(const glm::vec<4, T, Q> &v) {
1832  return glm::vec<4, T, Q>(v.y, v.w, v.z, v.z);
1833  }
1834 
1835  // ywzw
1836  template<typename T, qualifier Q>
1837  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywzw(const glm::vec<4, T, Q> &v) {
1838  return glm::vec<4, T, Q>(v.y, v.w, v.z, v.w);
1839  }
1840 
1841  // ywwx
1842  template<typename T, qualifier Q>
1843  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywwx(const glm::vec<4, T, Q> &v) {
1844  return glm::vec<4, T, Q>(v.y, v.w, v.w, v.x);
1845  }
1846 
1847  // ywwy
1848  template<typename T, qualifier Q>
1849  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywwy(const glm::vec<4, T, Q> &v) {
1850  return glm::vec<4, T, Q>(v.y, v.w, v.w, v.y);
1851  }
1852 
1853  // ywwz
1854  template<typename T, qualifier Q>
1855  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywwz(const glm::vec<4, T, Q> &v) {
1856  return glm::vec<4, T, Q>(v.y, v.w, v.w, v.z);
1857  }
1858 
1859  // ywww
1860  template<typename T, qualifier Q>
1861  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> ywww(const glm::vec<4, T, Q> &v) {
1862  return glm::vec<4, T, Q>(v.y, v.w, v.w, v.w);
1863  }
1864 
1865  // zxxx
1866  template<typename T, qualifier Q>
1867  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxxx(const glm::vec<3, T, Q> &v) {
1868  return glm::vec<4, T, Q>(v.z, v.x, v.x, v.x);
1869  }
1870 
1871  template<typename T, qualifier Q>
1872  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxxx(const glm::vec<4, T, Q> &v) {
1873  return glm::vec<4, T, Q>(v.z, v.x, v.x, v.x);
1874  }
1875 
1876  // zxxy
1877  template<typename T, qualifier Q>
1878  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxxy(const glm::vec<3, T, Q> &v) {
1879  return glm::vec<4, T, Q>(v.z, v.x, v.x, v.y);
1880  }
1881 
1882  template<typename T, qualifier Q>
1883  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxxy(const glm::vec<4, T, Q> &v) {
1884  return glm::vec<4, T, Q>(v.z, v.x, v.x, v.y);
1885  }
1886 
1887  // zxxz
1888  template<typename T, qualifier Q>
1889  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxxz(const glm::vec<3, T, Q> &v) {
1890  return glm::vec<4, T, Q>(v.z, v.x, v.x, v.z);
1891  }
1892 
1893  template<typename T, qualifier Q>
1894  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxxz(const glm::vec<4, T, Q> &v) {
1895  return glm::vec<4, T, Q>(v.z, v.x, v.x, v.z);
1896  }
1897 
1898  // zxxw
1899  template<typename T, qualifier Q>
1900  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxxw(const glm::vec<4, T, Q> &v) {
1901  return glm::vec<4, T, Q>(v.z, v.x, v.x, v.w);
1902  }
1903 
1904  // zxyx
1905  template<typename T, qualifier Q>
1906  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxyx(const glm::vec<3, T, Q> &v) {
1907  return glm::vec<4, T, Q>(v.z, v.x, v.y, v.x);
1908  }
1909 
1910  template<typename T, qualifier Q>
1911  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxyx(const glm::vec<4, T, Q> &v) {
1912  return glm::vec<4, T, Q>(v.z, v.x, v.y, v.x);
1913  }
1914 
1915  // zxyy
1916  template<typename T, qualifier Q>
1917  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxyy(const glm::vec<3, T, Q> &v) {
1918  return glm::vec<4, T, Q>(v.z, v.x, v.y, v.y);
1919  }
1920 
1921  template<typename T, qualifier Q>
1922  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxyy(const glm::vec<4, T, Q> &v) {
1923  return glm::vec<4, T, Q>(v.z, v.x, v.y, v.y);
1924  }
1925 
1926  // zxyz
1927  template<typename T, qualifier Q>
1928  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxyz(const glm::vec<3, T, Q> &v) {
1929  return glm::vec<4, T, Q>(v.z, v.x, v.y, v.z);
1930  }
1931 
1932  template<typename T, qualifier Q>
1933  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxyz(const glm::vec<4, T, Q> &v) {
1934  return glm::vec<4, T, Q>(v.z, v.x, v.y, v.z);
1935  }
1936 
1937  // zxyw
1938  template<typename T, qualifier Q>
1939  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxyw(const glm::vec<4, T, Q> &v) {
1940  return glm::vec<4, T, Q>(v.z, v.x, v.y, v.w);
1941  }
1942 
1943  // zxzx
1944  template<typename T, qualifier Q>
1945  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxzx(const glm::vec<3, T, Q> &v) {
1946  return glm::vec<4, T, Q>(v.z, v.x, v.z, v.x);
1947  }
1948 
1949  template<typename T, qualifier Q>
1950  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxzx(const glm::vec<4, T, Q> &v) {
1951  return glm::vec<4, T, Q>(v.z, v.x, v.z, v.x);
1952  }
1953 
1954  // zxzy
1955  template<typename T, qualifier Q>
1956  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxzy(const glm::vec<3, T, Q> &v) {
1957  return glm::vec<4, T, Q>(v.z, v.x, v.z, v.y);
1958  }
1959 
1960  template<typename T, qualifier Q>
1961  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxzy(const glm::vec<4, T, Q> &v) {
1962  return glm::vec<4, T, Q>(v.z, v.x, v.z, v.y);
1963  }
1964 
1965  // zxzz
1966  template<typename T, qualifier Q>
1967  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxzz(const glm::vec<3, T, Q> &v) {
1968  return glm::vec<4, T, Q>(v.z, v.x, v.z, v.z);
1969  }
1970 
1971  template<typename T, qualifier Q>
1972  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxzz(const glm::vec<4, T, Q> &v) {
1973  return glm::vec<4, T, Q>(v.z, v.x, v.z, v.z);
1974  }
1975 
1976  // zxzw
1977  template<typename T, qualifier Q>
1978  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxzw(const glm::vec<4, T, Q> &v) {
1979  return glm::vec<4, T, Q>(v.z, v.x, v.z, v.w);
1980  }
1981 
1982  // zxwx
1983  template<typename T, qualifier Q>
1984  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxwx(const glm::vec<4, T, Q> &v) {
1985  return glm::vec<4, T, Q>(v.z, v.x, v.w, v.x);
1986  }
1987 
1988  // zxwy
1989  template<typename T, qualifier Q>
1990  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxwy(const glm::vec<4, T, Q> &v) {
1991  return glm::vec<4, T, Q>(v.z, v.x, v.w, v.y);
1992  }
1993 
1994  // zxwz
1995  template<typename T, qualifier Q>
1996  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxwz(const glm::vec<4, T, Q> &v) {
1997  return glm::vec<4, T, Q>(v.z, v.x, v.w, v.z);
1998  }
1999 
2000  // zxww
2001  template<typename T, qualifier Q>
2002  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zxww(const glm::vec<4, T, Q> &v) {
2003  return glm::vec<4, T, Q>(v.z, v.x, v.w, v.w);
2004  }
2005 
2006  // zyxx
2007  template<typename T, qualifier Q>
2008  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyxx(const glm::vec<3, T, Q> &v) {
2009  return glm::vec<4, T, Q>(v.z, v.y, v.x, v.x);
2010  }
2011 
2012  template<typename T, qualifier Q>
2013  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyxx(const glm::vec<4, T, Q> &v) {
2014  return glm::vec<4, T, Q>(v.z, v.y, v.x, v.x);
2015  }
2016 
2017  // zyxy
2018  template<typename T, qualifier Q>
2019  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyxy(const glm::vec<3, T, Q> &v) {
2020  return glm::vec<4, T, Q>(v.z, v.y, v.x, v.y);
2021  }
2022 
2023  template<typename T, qualifier Q>
2024  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyxy(const glm::vec<4, T, Q> &v) {
2025  return glm::vec<4, T, Q>(v.z, v.y, v.x, v.y);
2026  }
2027 
2028  // zyxz
2029  template<typename T, qualifier Q>
2030  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyxz(const glm::vec<3, T, Q> &v) {
2031  return glm::vec<4, T, Q>(v.z, v.y, v.x, v.z);
2032  }
2033 
2034  template<typename T, qualifier Q>
2035  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyxz(const glm::vec<4, T, Q> &v) {
2036  return glm::vec<4, T, Q>(v.z, v.y, v.x, v.z);
2037  }
2038 
2039  // zyxw
2040  template<typename T, qualifier Q>
2041  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyxw(const glm::vec<4, T, Q> &v) {
2042  return glm::vec<4, T, Q>(v.z, v.y, v.x, v.w);
2043  }
2044 
2045  // zyyx
2046  template<typename T, qualifier Q>
2047  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyyx(const glm::vec<3, T, Q> &v) {
2048  return glm::vec<4, T, Q>(v.z, v.y, v.y, v.x);
2049  }
2050 
2051  template<typename T, qualifier Q>
2052  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyyx(const glm::vec<4, T, Q> &v) {
2053  return glm::vec<4, T, Q>(v.z, v.y, v.y, v.x);
2054  }
2055 
2056  // zyyy
2057  template<typename T, qualifier Q>
2058  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyyy(const glm::vec<3, T, Q> &v) {
2059  return glm::vec<4, T, Q>(v.z, v.y, v.y, v.y);
2060  }
2061 
2062  template<typename T, qualifier Q>
2063  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyyy(const glm::vec<4, T, Q> &v) {
2064  return glm::vec<4, T, Q>(v.z, v.y, v.y, v.y);
2065  }
2066 
2067  // zyyz
2068  template<typename T, qualifier Q>
2069  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyyz(const glm::vec<3, T, Q> &v) {
2070  return glm::vec<4, T, Q>(v.z, v.y, v.y, v.z);
2071  }
2072 
2073  template<typename T, qualifier Q>
2074  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyyz(const glm::vec<4, T, Q> &v) {
2075  return glm::vec<4, T, Q>(v.z, v.y, v.y, v.z);
2076  }
2077 
2078  // zyyw
2079  template<typename T, qualifier Q>
2080  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyyw(const glm::vec<4, T, Q> &v) {
2081  return glm::vec<4, T, Q>(v.z, v.y, v.y, v.w);
2082  }
2083 
2084  // zyzx
2085  template<typename T, qualifier Q>
2086  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyzx(const glm::vec<3, T, Q> &v) {
2087  return glm::vec<4, T, Q>(v.z, v.y, v.z, v.x);
2088  }
2089 
2090  template<typename T, qualifier Q>
2091  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyzx(const glm::vec<4, T, Q> &v) {
2092  return glm::vec<4, T, Q>(v.z, v.y, v.z, v.x);
2093  }
2094 
2095  // zyzy
2096  template<typename T, qualifier Q>
2097  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyzy(const glm::vec<3, T, Q> &v) {
2098  return glm::vec<4, T, Q>(v.z, v.y, v.z, v.y);
2099  }
2100 
2101  template<typename T, qualifier Q>
2102  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyzy(const glm::vec<4, T, Q> &v) {
2103  return glm::vec<4, T, Q>(v.z, v.y, v.z, v.y);
2104  }
2105 
2106  // zyzz
2107  template<typename T, qualifier Q>
2108  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyzz(const glm::vec<3, T, Q> &v) {
2109  return glm::vec<4, T, Q>(v.z, v.y, v.z, v.z);
2110  }
2111 
2112  template<typename T, qualifier Q>
2113  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyzz(const glm::vec<4, T, Q> &v) {
2114  return glm::vec<4, T, Q>(v.z, v.y, v.z, v.z);
2115  }
2116 
2117  // zyzw
2118  template<typename T, qualifier Q>
2119  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyzw(const glm::vec<4, T, Q> &v) {
2120  return glm::vec<4, T, Q>(v.z, v.y, v.z, v.w);
2121  }
2122 
2123  // zywx
2124  template<typename T, qualifier Q>
2125  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zywx(const glm::vec<4, T, Q> &v) {
2126  return glm::vec<4, T, Q>(v.z, v.y, v.w, v.x);
2127  }
2128 
2129  // zywy
2130  template<typename T, qualifier Q>
2131  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zywy(const glm::vec<4, T, Q> &v) {
2132  return glm::vec<4, T, Q>(v.z, v.y, v.w, v.y);
2133  }
2134 
2135  // zywz
2136  template<typename T, qualifier Q>
2137  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zywz(const glm::vec<4, T, Q> &v) {
2138  return glm::vec<4, T, Q>(v.z, v.y, v.w, v.z);
2139  }
2140 
2141  // zyww
2142  template<typename T, qualifier Q>
2143  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zyww(const glm::vec<4, T, Q> &v) {
2144  return glm::vec<4, T, Q>(v.z, v.y, v.w, v.w);
2145  }
2146 
2147  // zzxx
2148  template<typename T, qualifier Q>
2149  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzxx(const glm::vec<3, T, Q> &v) {
2150  return glm::vec<4, T, Q>(v.z, v.z, v.x, v.x);
2151  }
2152 
2153  template<typename T, qualifier Q>
2154  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzxx(const glm::vec<4, T, Q> &v) {
2155  return glm::vec<4, T, Q>(v.z, v.z, v.x, v.x);
2156  }
2157 
2158  // zzxy
2159  template<typename T, qualifier Q>
2160  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzxy(const glm::vec<3, T, Q> &v) {
2161  return glm::vec<4, T, Q>(v.z, v.z, v.x, v.y);
2162  }
2163 
2164  template<typename T, qualifier Q>
2165  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzxy(const glm::vec<4, T, Q> &v) {
2166  return glm::vec<4, T, Q>(v.z, v.z, v.x, v.y);
2167  }
2168 
2169  // zzxz
2170  template<typename T, qualifier Q>
2171  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzxz(const glm::vec<3, T, Q> &v) {
2172  return glm::vec<4, T, Q>(v.z, v.z, v.x, v.z);
2173  }
2174 
2175  template<typename T, qualifier Q>
2176  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzxz(const glm::vec<4, T, Q> &v) {
2177  return glm::vec<4, T, Q>(v.z, v.z, v.x, v.z);
2178  }
2179 
2180  // zzxw
2181  template<typename T, qualifier Q>
2182  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzxw(const glm::vec<4, T, Q> &v) {
2183  return glm::vec<4, T, Q>(v.z, v.z, v.x, v.w);
2184  }
2185 
2186  // zzyx
2187  template<typename T, qualifier Q>
2188  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzyx(const glm::vec<3, T, Q> &v) {
2189  return glm::vec<4, T, Q>(v.z, v.z, v.y, v.x);
2190  }
2191 
2192  template<typename T, qualifier Q>
2193  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzyx(const glm::vec<4, T, Q> &v) {
2194  return glm::vec<4, T, Q>(v.z, v.z, v.y, v.x);
2195  }
2196 
2197  // zzyy
2198  template<typename T, qualifier Q>
2199  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzyy(const glm::vec<3, T, Q> &v) {
2200  return glm::vec<4, T, Q>(v.z, v.z, v.y, v.y);
2201  }
2202 
2203  template<typename T, qualifier Q>
2204  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzyy(const glm::vec<4, T, Q> &v) {
2205  return glm::vec<4, T, Q>(v.z, v.z, v.y, v.y);
2206  }
2207 
2208  // zzyz
2209  template<typename T, qualifier Q>
2210  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzyz(const glm::vec<3, T, Q> &v) {
2211  return glm::vec<4, T, Q>(v.z, v.z, v.y, v.z);
2212  }
2213 
2214  template<typename T, qualifier Q>
2215  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzyz(const glm::vec<4, T, Q> &v) {
2216  return glm::vec<4, T, Q>(v.z, v.z, v.y, v.z);
2217  }
2218 
2219  // zzyw
2220  template<typename T, qualifier Q>
2221  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzyw(const glm::vec<4, T, Q> &v) {
2222  return glm::vec<4, T, Q>(v.z, v.z, v.y, v.w);
2223  }
2224 
2225  // zzzx
2226  template<typename T, qualifier Q>
2227  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzzx(const glm::vec<3, T, Q> &v) {
2228  return glm::vec<4, T, Q>(v.z, v.z, v.z, v.x);
2229  }
2230 
2231  template<typename T, qualifier Q>
2232  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzzx(const glm::vec<4, T, Q> &v) {
2233  return glm::vec<4, T, Q>(v.z, v.z, v.z, v.x);
2234  }
2235 
2236  // zzzy
2237  template<typename T, qualifier Q>
2238  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzzy(const glm::vec<3, T, Q> &v) {
2239  return glm::vec<4, T, Q>(v.z, v.z, v.z, v.y);
2240  }
2241 
2242  template<typename T, qualifier Q>
2243  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzzy(const glm::vec<4, T, Q> &v) {
2244  return glm::vec<4, T, Q>(v.z, v.z, v.z, v.y);
2245  }
2246 
2247  // zzzz
2248  template<typename T, qualifier Q>
2249  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzzz(const glm::vec<3, T, Q> &v) {
2250  return glm::vec<4, T, Q>(v.z, v.z, v.z, v.z);
2251  }
2252 
2253  template<typename T, qualifier Q>
2254  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzzz(const glm::vec<4, T, Q> &v) {
2255  return glm::vec<4, T, Q>(v.z, v.z, v.z, v.z);
2256  }
2257 
2258  // zzzw
2259  template<typename T, qualifier Q>
2260  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzzw(const glm::vec<4, T, Q> &v) {
2261  return glm::vec<4, T, Q>(v.z, v.z, v.z, v.w);
2262  }
2263 
2264  // zzwx
2265  template<typename T, qualifier Q>
2266  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzwx(const glm::vec<4, T, Q> &v) {
2267  return glm::vec<4, T, Q>(v.z, v.z, v.w, v.x);
2268  }
2269 
2270  // zzwy
2271  template<typename T, qualifier Q>
2272  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzwy(const glm::vec<4, T, Q> &v) {
2273  return glm::vec<4, T, Q>(v.z, v.z, v.w, v.y);
2274  }
2275 
2276  // zzwz
2277  template<typename T, qualifier Q>
2278  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzwz(const glm::vec<4, T, Q> &v) {
2279  return glm::vec<4, T, Q>(v.z, v.z, v.w, v.z);
2280  }
2281 
2282  // zzww
2283  template<typename T, qualifier Q>
2284  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zzww(const glm::vec<4, T, Q> &v) {
2285  return glm::vec<4, T, Q>(v.z, v.z, v.w, v.w);
2286  }
2287 
2288  // zwxx
2289  template<typename T, qualifier Q>
2290  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwxx(const glm::vec<4, T, Q> &v) {
2291  return glm::vec<4, T, Q>(v.z, v.w, v.x, v.x);
2292  }
2293 
2294  // zwxy
2295  template<typename T, qualifier Q>
2296  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwxy(const glm::vec<4, T, Q> &v) {
2297  return glm::vec<4, T, Q>(v.z, v.w, v.x, v.y);
2298  }
2299 
2300  // zwxz
2301  template<typename T, qualifier Q>
2302  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwxz(const glm::vec<4, T, Q> &v) {
2303  return glm::vec<4, T, Q>(v.z, v.w, v.x, v.z);
2304  }
2305 
2306  // zwxw
2307  template<typename T, qualifier Q>
2308  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwxw(const glm::vec<4, T, Q> &v) {
2309  return glm::vec<4, T, Q>(v.z, v.w, v.x, v.w);
2310  }
2311 
2312  // zwyx
2313  template<typename T, qualifier Q>
2314  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwyx(const glm::vec<4, T, Q> &v) {
2315  return glm::vec<4, T, Q>(v.z, v.w, v.y, v.x);
2316  }
2317 
2318  // zwyy
2319  template<typename T, qualifier Q>
2320  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwyy(const glm::vec<4, T, Q> &v) {
2321  return glm::vec<4, T, Q>(v.z, v.w, v.y, v.y);
2322  }
2323 
2324  // zwyz
2325  template<typename T, qualifier Q>
2326  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwyz(const glm::vec<4, T, Q> &v) {
2327  return glm::vec<4, T, Q>(v.z, v.w, v.y, v.z);
2328  }
2329 
2330  // zwyw
2331  template<typename T, qualifier Q>
2332  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwyw(const glm::vec<4, T, Q> &v) {
2333  return glm::vec<4, T, Q>(v.z, v.w, v.y, v.w);
2334  }
2335 
2336  // zwzx
2337  template<typename T, qualifier Q>
2338  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwzx(const glm::vec<4, T, Q> &v) {
2339  return glm::vec<4, T, Q>(v.z, v.w, v.z, v.x);
2340  }
2341 
2342  // zwzy
2343  template<typename T, qualifier Q>
2344  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwzy(const glm::vec<4, T, Q> &v) {
2345  return glm::vec<4, T, Q>(v.z, v.w, v.z, v.y);
2346  }
2347 
2348  // zwzz
2349  template<typename T, qualifier Q>
2350  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwzz(const glm::vec<4, T, Q> &v) {
2351  return glm::vec<4, T, Q>(v.z, v.w, v.z, v.z);
2352  }
2353 
2354  // zwzw
2355  template<typename T, qualifier Q>
2356  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwzw(const glm::vec<4, T, Q> &v) {
2357  return glm::vec<4, T, Q>(v.z, v.w, v.z, v.w);
2358  }
2359 
2360  // zwwx
2361  template<typename T, qualifier Q>
2362  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwwx(const glm::vec<4, T, Q> &v) {
2363  return glm::vec<4, T, Q>(v.z, v.w, v.w, v.x);
2364  }
2365 
2366  // zwwy
2367  template<typename T, qualifier Q>
2368  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwwy(const glm::vec<4, T, Q> &v) {
2369  return glm::vec<4, T, Q>(v.z, v.w, v.w, v.y);
2370  }
2371 
2372  // zwwz
2373  template<typename T, qualifier Q>
2374  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwwz(const glm::vec<4, T, Q> &v) {
2375  return glm::vec<4, T, Q>(v.z, v.w, v.w, v.z);
2376  }
2377 
2378  // zwww
2379  template<typename T, qualifier Q>
2380  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> zwww(const glm::vec<4, T, Q> &v) {
2381  return glm::vec<4, T, Q>(v.z, v.w, v.w, v.w);
2382  }
2383 
2384  // wxxx
2385  template<typename T, qualifier Q>
2386  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxxx(const glm::vec<4, T, Q> &v) {
2387  return glm::vec<4, T, Q>(v.w, v.x, v.x, v.x);
2388  }
2389 
2390  // wxxy
2391  template<typename T, qualifier Q>
2392  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxxy(const glm::vec<4, T, Q> &v) {
2393  return glm::vec<4, T, Q>(v.w, v.x, v.x, v.y);
2394  }
2395 
2396  // wxxz
2397  template<typename T, qualifier Q>
2398  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxxz(const glm::vec<4, T, Q> &v) {
2399  return glm::vec<4, T, Q>(v.w, v.x, v.x, v.z);
2400  }
2401 
2402  // wxxw
2403  template<typename T, qualifier Q>
2404  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxxw(const glm::vec<4, T, Q> &v) {
2405  return glm::vec<4, T, Q>(v.w, v.x, v.x, v.w);
2406  }
2407 
2408  // wxyx
2409  template<typename T, qualifier Q>
2410  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxyx(const glm::vec<4, T, Q> &v) {
2411  return glm::vec<4, T, Q>(v.w, v.x, v.y, v.x);
2412  }
2413 
2414  // wxyy
2415  template<typename T, qualifier Q>
2416  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxyy(const glm::vec<4, T, Q> &v) {
2417  return glm::vec<4, T, Q>(v.w, v.x, v.y, v.y);
2418  }
2419 
2420  // wxyz
2421  template<typename T, qualifier Q>
2422  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxyz(const glm::vec<4, T, Q> &v) {
2423  return glm::vec<4, T, Q>(v.w, v.x, v.y, v.z);
2424  }
2425 
2426  // wxyw
2427  template<typename T, qualifier Q>
2428  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxyw(const glm::vec<4, T, Q> &v) {
2429  return glm::vec<4, T, Q>(v.w, v.x, v.y, v.w);
2430  }
2431 
2432  // wxzx
2433  template<typename T, qualifier Q>
2434  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxzx(const glm::vec<4, T, Q> &v) {
2435  return glm::vec<4, T, Q>(v.w, v.x, v.z, v.x);
2436  }
2437 
2438  // wxzy
2439  template<typename T, qualifier Q>
2440  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxzy(const glm::vec<4, T, Q> &v) {
2441  return glm::vec<4, T, Q>(v.w, v.x, v.z, v.y);
2442  }
2443 
2444  // wxzz
2445  template<typename T, qualifier Q>
2446  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxzz(const glm::vec<4, T, Q> &v) {
2447  return glm::vec<4, T, Q>(v.w, v.x, v.z, v.z);
2448  }
2449 
2450  // wxzw
2451  template<typename T, qualifier Q>
2452  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxzw(const glm::vec<4, T, Q> &v) {
2453  return glm::vec<4, T, Q>(v.w, v.x, v.z, v.w);
2454  }
2455 
2456  // wxwx
2457  template<typename T, qualifier Q>
2458  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxwx(const glm::vec<4, T, Q> &v) {
2459  return glm::vec<4, T, Q>(v.w, v.x, v.w, v.x);
2460  }
2461 
2462  // wxwy
2463  template<typename T, qualifier Q>
2464  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxwy(const glm::vec<4, T, Q> &v) {
2465  return glm::vec<4, T, Q>(v.w, v.x, v.w, v.y);
2466  }
2467 
2468  // wxwz
2469  template<typename T, qualifier Q>
2470  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxwz(const glm::vec<4, T, Q> &v) {
2471  return glm::vec<4, T, Q>(v.w, v.x, v.w, v.z);
2472  }
2473 
2474  // wxww
2475  template<typename T, qualifier Q>
2476  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wxww(const glm::vec<4, T, Q> &v) {
2477  return glm::vec<4, T, Q>(v.w, v.x, v.w, v.w);
2478  }
2479 
2480  // wyxx
2481  template<typename T, qualifier Q>
2482  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyxx(const glm::vec<4, T, Q> &v) {
2483  return glm::vec<4, T, Q>(v.w, v.y, v.x, v.x);
2484  }
2485 
2486  // wyxy
2487  template<typename T, qualifier Q>
2488  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyxy(const glm::vec<4, T, Q> &v) {
2489  return glm::vec<4, T, Q>(v.w, v.y, v.x, v.y);
2490  }
2491 
2492  // wyxz
2493  template<typename T, qualifier Q>
2494  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyxz(const glm::vec<4, T, Q> &v) {
2495  return glm::vec<4, T, Q>(v.w, v.y, v.x, v.z);
2496  }
2497 
2498  // wyxw
2499  template<typename T, qualifier Q>
2500  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyxw(const glm::vec<4, T, Q> &v) {
2501  return glm::vec<4, T, Q>(v.w, v.y, v.x, v.w);
2502  }
2503 
2504  // wyyx
2505  template<typename T, qualifier Q>
2506  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyyx(const glm::vec<4, T, Q> &v) {
2507  return glm::vec<4, T, Q>(v.w, v.y, v.y, v.x);
2508  }
2509 
2510  // wyyy
2511  template<typename T, qualifier Q>
2512  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyyy(const glm::vec<4, T, Q> &v) {
2513  return glm::vec<4, T, Q>(v.w, v.y, v.y, v.y);
2514  }
2515 
2516  // wyyz
2517  template<typename T, qualifier Q>
2518  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyyz(const glm::vec<4, T, Q> &v) {
2519  return glm::vec<4, T, Q>(v.w, v.y, v.y, v.z);
2520  }
2521 
2522  // wyyw
2523  template<typename T, qualifier Q>
2524  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyyw(const glm::vec<4, T, Q> &v) {
2525  return glm::vec<4, T, Q>(v.w, v.y, v.y, v.w);
2526  }
2527 
2528  // wyzx
2529  template<typename T, qualifier Q>
2530  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyzx(const glm::vec<4, T, Q> &v) {
2531  return glm::vec<4, T, Q>(v.w, v.y, v.z, v.x);
2532  }
2533 
2534  // wyzy
2535  template<typename T, qualifier Q>
2536  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyzy(const glm::vec<4, T, Q> &v) {
2537  return glm::vec<4, T, Q>(v.w, v.y, v.z, v.y);
2538  }
2539 
2540  // wyzz
2541  template<typename T, qualifier Q>
2542  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyzz(const glm::vec<4, T, Q> &v) {
2543  return glm::vec<4, T, Q>(v.w, v.y, v.z, v.z);
2544  }
2545 
2546  // wyzw
2547  template<typename T, qualifier Q>
2548  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyzw(const glm::vec<4, T, Q> &v) {
2549  return glm::vec<4, T, Q>(v.w, v.y, v.z, v.w);
2550  }
2551 
2552  // wywx
2553  template<typename T, qualifier Q>
2554  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wywx(const glm::vec<4, T, Q> &v) {
2555  return glm::vec<4, T, Q>(v.w, v.y, v.w, v.x);
2556  }
2557 
2558  // wywy
2559  template<typename T, qualifier Q>
2560  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wywy(const glm::vec<4, T, Q> &v) {
2561  return glm::vec<4, T, Q>(v.w, v.y, v.w, v.y);
2562  }
2563 
2564  // wywz
2565  template<typename T, qualifier Q>
2566  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wywz(const glm::vec<4, T, Q> &v) {
2567  return glm::vec<4, T, Q>(v.w, v.y, v.w, v.z);
2568  }
2569 
2570  // wyww
2571  template<typename T, qualifier Q>
2572  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wyww(const glm::vec<4, T, Q> &v) {
2573  return glm::vec<4, T, Q>(v.w, v.y, v.w, v.w);
2574  }
2575 
2576  // wzxx
2577  template<typename T, qualifier Q>
2578  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzxx(const glm::vec<4, T, Q> &v) {
2579  return glm::vec<4, T, Q>(v.w, v.z, v.x, v.x);
2580  }
2581 
2582  // wzxy
2583  template<typename T, qualifier Q>
2584  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzxy(const glm::vec<4, T, Q> &v) {
2585  return glm::vec<4, T, Q>(v.w, v.z, v.x, v.y);
2586  }
2587 
2588  // wzxz
2589  template<typename T, qualifier Q>
2590  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzxz(const glm::vec<4, T, Q> &v) {
2591  return glm::vec<4, T, Q>(v.w, v.z, v.x, v.z);
2592  }
2593 
2594  // wzxw
2595  template<typename T, qualifier Q>
2596  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzxw(const glm::vec<4, T, Q> &v) {
2597  return glm::vec<4, T, Q>(v.w, v.z, v.x, v.w);
2598  }
2599 
2600  // wzyx
2601  template<typename T, qualifier Q>
2602  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzyx(const glm::vec<4, T, Q> &v) {
2603  return glm::vec<4, T, Q>(v.w, v.z, v.y, v.x);
2604  }
2605 
2606  // wzyy
2607  template<typename T, qualifier Q>
2608  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzyy(const glm::vec<4, T, Q> &v) {
2609  return glm::vec<4, T, Q>(v.w, v.z, v.y, v.y);
2610  }
2611 
2612  // wzyz
2613  template<typename T, qualifier Q>
2614  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzyz(const glm::vec<4, T, Q> &v) {
2615  return glm::vec<4, T, Q>(v.w, v.z, v.y, v.z);
2616  }
2617 
2618  // wzyw
2619  template<typename T, qualifier Q>
2620  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzyw(const glm::vec<4, T, Q> &v) {
2621  return glm::vec<4, T, Q>(v.w, v.z, v.y, v.w);
2622  }
2623 
2624  // wzzx
2625  template<typename T, qualifier Q>
2626  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzzx(const glm::vec<4, T, Q> &v) {
2627  return glm::vec<4, T, Q>(v.w, v.z, v.z, v.x);
2628  }
2629 
2630  // wzzy
2631  template<typename T, qualifier Q>
2632  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzzy(const glm::vec<4, T, Q> &v) {
2633  return glm::vec<4, T, Q>(v.w, v.z, v.z, v.y);
2634  }
2635 
2636  // wzzz
2637  template<typename T, qualifier Q>
2638  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzzz(const glm::vec<4, T, Q> &v) {
2639  return glm::vec<4, T, Q>(v.w, v.z, v.z, v.z);
2640  }
2641 
2642  // wzzw
2643  template<typename T, qualifier Q>
2644  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzzw(const glm::vec<4, T, Q> &v) {
2645  return glm::vec<4, T, Q>(v.w, v.z, v.z, v.w);
2646  }
2647 
2648  // wzwx
2649  template<typename T, qualifier Q>
2650  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzwx(const glm::vec<4, T, Q> &v) {
2651  return glm::vec<4, T, Q>(v.w, v.z, v.w, v.x);
2652  }
2653 
2654  // wzwy
2655  template<typename T, qualifier Q>
2656  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzwy(const glm::vec<4, T, Q> &v) {
2657  return glm::vec<4, T, Q>(v.w, v.z, v.w, v.y);
2658  }
2659 
2660  // wzwz
2661  template<typename T, qualifier Q>
2662  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzwz(const glm::vec<4, T, Q> &v) {
2663  return glm::vec<4, T, Q>(v.w, v.z, v.w, v.z);
2664  }
2665 
2666  // wzww
2667  template<typename T, qualifier Q>
2668  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wzww(const glm::vec<4, T, Q> &v) {
2669  return glm::vec<4, T, Q>(v.w, v.z, v.w, v.w);
2670  }
2671 
2672  // wwxx
2673  template<typename T, qualifier Q>
2674  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwxx(const glm::vec<4, T, Q> &v) {
2675  return glm::vec<4, T, Q>(v.w, v.w, v.x, v.x);
2676  }
2677 
2678  // wwxy
2679  template<typename T, qualifier Q>
2680  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwxy(const glm::vec<4, T, Q> &v) {
2681  return glm::vec<4, T, Q>(v.w, v.w, v.x, v.y);
2682  }
2683 
2684  // wwxz
2685  template<typename T, qualifier Q>
2686  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwxz(const glm::vec<4, T, Q> &v) {
2687  return glm::vec<4, T, Q>(v.w, v.w, v.x, v.z);
2688  }
2689 
2690  // wwxw
2691  template<typename T, qualifier Q>
2692  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwxw(const glm::vec<4, T, Q> &v) {
2693  return glm::vec<4, T, Q>(v.w, v.w, v.x, v.w);
2694  }
2695 
2696  // wwyx
2697  template<typename T, qualifier Q>
2698  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwyx(const glm::vec<4, T, Q> &v) {
2699  return glm::vec<4, T, Q>(v.w, v.w, v.y, v.x);
2700  }
2701 
2702  // wwyy
2703  template<typename T, qualifier Q>
2704  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwyy(const glm::vec<4, T, Q> &v) {
2705  return glm::vec<4, T, Q>(v.w, v.w, v.y, v.y);
2706  }
2707 
2708  // wwyz
2709  template<typename T, qualifier Q>
2710  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwyz(const glm::vec<4, T, Q> &v) {
2711  return glm::vec<4, T, Q>(v.w, v.w, v.y, v.z);
2712  }
2713 
2714  // wwyw
2715  template<typename T, qualifier Q>
2716  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwyw(const glm::vec<4, T, Q> &v) {
2717  return glm::vec<4, T, Q>(v.w, v.w, v.y, v.w);
2718  }
2719 
2720  // wwzx
2721  template<typename T, qualifier Q>
2722  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwzx(const glm::vec<4, T, Q> &v) {
2723  return glm::vec<4, T, Q>(v.w, v.w, v.z, v.x);
2724  }
2725 
2726  // wwzy
2727  template<typename T, qualifier Q>
2728  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwzy(const glm::vec<4, T, Q> &v) {
2729  return glm::vec<4, T, Q>(v.w, v.w, v.z, v.y);
2730  }
2731 
2732  // wwzz
2733  template<typename T, qualifier Q>
2734  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwzz(const glm::vec<4, T, Q> &v) {
2735  return glm::vec<4, T, Q>(v.w, v.w, v.z, v.z);
2736  }
2737 
2738  // wwzw
2739  template<typename T, qualifier Q>
2740  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwzw(const glm::vec<4, T, Q> &v) {
2741  return glm::vec<4, T, Q>(v.w, v.w, v.z, v.w);
2742  }
2743 
2744  // wwwx
2745  template<typename T, qualifier Q>
2746  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwwx(const glm::vec<4, T, Q> &v) {
2747  return glm::vec<4, T, Q>(v.w, v.w, v.w, v.x);
2748  }
2749 
2750  // wwwy
2751  template<typename T, qualifier Q>
2752  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwwy(const glm::vec<4, T, Q> &v) {
2753  return glm::vec<4, T, Q>(v.w, v.w, v.w, v.y);
2754  }
2755 
2756  // wwwz
2757  template<typename T, qualifier Q>
2758  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwwz(const glm::vec<4, T, Q> &v) {
2759  return glm::vec<4, T, Q>(v.w, v.w, v.w, v.z);
2760  }
2761 
2762  // wwww
2763  template<typename T, qualifier Q>
2764  GLM_FUNC_QUALIFIER glm::vec<4, T, Q> wwww(const glm::vec<4, T, Q> &v) {
2765  return glm::vec<4, T, Q>(v.w, v.w, v.w, v.w);
2766  }
2767 
2769 }//namespace glm