ruby_math/algebra/vec/
vec4d.rs

1#![allow(dead_code)]
2
3use std::{
4    fmt::Display,
5    ops::{Add, AddAssign, Div, DivAssign, Index, IndexMut, Mul, MulAssign, Neg, Sub, SubAssign},
6};
7
8use super::{vec4f, Vec2d, Vec3d, Vec4f};
9
10#[derive(Clone, Copy, PartialEq, Debug)]
11pub struct Vec4d {
12    x: f64,
13    y: f64,
14    z: f64,
15    w: f64,
16}
17
18pub fn vec4d(x: f64, y: f64, z: f64, w: f64) -> Vec4d {
19    Vec4d::new(x, y, z, w)
20}
21
22impl Display for Vec4d {
23    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
24        write!(
25            f,
26            "Vec4d(x: {}, y: {}, z: {}, w: {})",
27            self.x, self.y, self.z, self.w
28        )
29    }
30}
31
32impl Default for Vec4d {
33    fn default() -> Self {
34        Self::new(0.0, 0.0, 0.0, 0.0)
35    }
36}
37
38impl Add<Vec4d> for Vec4d {
39    type Output = Vec4d;
40
41    fn add(self, rhs: Vec4d) -> Self::Output {
42        Vec4d::new(
43            self.x + rhs.x,
44            self.y + rhs.y,
45            self.z + rhs.z,
46            self.w + rhs.w,
47        )
48    }
49}
50
51impl Add<f64> for Vec4d {
52    type Output = Vec4d;
53
54    fn add(self, rhs: f64) -> Self::Output {
55        Vec4d::new(self.x + rhs, self.y + rhs, self.z + rhs, self.w + rhs)
56    }
57}
58
59impl Add<Vec4d> for f64 {
60    type Output = Vec4d;
61
62    fn add(self, rhs: Vec4d) -> Self::Output {
63        Vec4d::new(self + rhs.x, self + rhs.y, self + rhs.z, self + rhs.w)
64    }
65}
66
67impl AddAssign<Vec4d> for Vec4d {
68    fn add_assign(&mut self, rhs: Vec4d) {
69        self.x += rhs.x;
70        self.y += rhs.y;
71        self.z += rhs.z;
72        self.w += rhs.w;
73    }
74}
75
76impl AddAssign<f64> for Vec4d {
77    fn add_assign(&mut self, rhs: f64) {
78        self.x += rhs;
79        self.y += rhs;
80        self.z += rhs;
81        self.w += rhs;
82    }
83}
84
85impl Sub<Vec4d> for Vec4d {
86    type Output = Vec4d;
87
88    fn sub(self, rhs: Vec4d) -> Self::Output {
89        Vec4d::new(
90            self.x - rhs.x,
91            self.y - rhs.y,
92            self.z - rhs.z,
93            self.w - rhs.w,
94        )
95    }
96}
97
98impl Sub<f64> for Vec4d {
99    type Output = Vec4d;
100
101    fn sub(self, rhs: f64) -> Self::Output {
102        Vec4d::new(self.x - rhs, self.y - rhs, self.z - rhs, self.w - rhs)
103    }
104}
105
106impl Sub<Vec4d> for f64 {
107    type Output = Vec4d;
108
109    fn sub(self, rhs: Vec4d) -> Self::Output {
110        Vec4d::new(self - rhs.x, self - rhs.y, self - rhs.z, self - rhs.w)
111    }
112}
113
114impl SubAssign<Vec4d> for Vec4d {
115    fn sub_assign(&mut self, rhs: Vec4d) {
116        self.x -= rhs.x;
117        self.y -= rhs.y;
118        self.z -= rhs.z;
119        self.w -= rhs.w;
120    }
121}
122
123impl SubAssign<f64> for Vec4d {
124    fn sub_assign(&mut self, rhs: f64) {
125        self.x -= rhs;
126        self.y -= rhs;
127        self.z -= rhs;
128        self.w -= rhs;
129    }
130}
131
132impl Mul<Vec4d> for Vec4d {
133    type Output = Vec4d;
134
135    fn mul(self, rhs: Vec4d) -> Self::Output {
136        Vec4d::new(
137            self.x * rhs.x,
138            self.y * rhs.y,
139            self.z * rhs.z,
140            self.w * rhs.w,
141        )
142    }
143}
144
145impl Mul<f64> for Vec4d {
146    type Output = Vec4d;
147
148    fn mul(self, rhs: f64) -> Self::Output {
149        Vec4d::new(self.x * rhs, self.y * rhs, self.z * rhs, self.w * rhs)
150    }
151}
152
153impl Mul<Vec4d> for f64 {
154    type Output = Vec4d;
155
156    fn mul(self, rhs: Vec4d) -> Self::Output {
157        Vec4d::new(self * rhs.x, self * rhs.y, self * rhs.z, self * rhs.w)
158    }
159}
160
161impl MulAssign<Vec4d> for Vec4d {
162    fn mul_assign(&mut self, rhs: Vec4d) {
163        self.x *= rhs.x;
164        self.y *= rhs.y;
165        self.z *= rhs.z;
166        self.w *= rhs.w;
167    }
168}
169
170impl MulAssign<f64> for Vec4d {
171    fn mul_assign(&mut self, rhs: f64) {
172        self.x *= rhs;
173        self.y *= rhs;
174        self.z *= rhs;
175        self.w *= rhs;
176    }
177}
178
179impl Div<Vec4d> for Vec4d {
180    type Output = Vec4d;
181
182    fn div(self, rhs: Vec4d) -> Self::Output {
183        Vec4d::new(
184            self.x / rhs.x,
185            self.y / rhs.y,
186            self.z / rhs.z,
187            self.w / rhs.w,
188        )
189    }
190}
191
192impl Div<f64> for Vec4d {
193    type Output = Vec4d;
194
195    fn div(self, rhs: f64) -> Self::Output {
196        Vec4d::new(self.x / rhs, self.y / rhs, self.z / rhs, self.w / rhs)
197    }
198}
199
200impl Div<Vec4d> for f64 {
201    type Output = Vec4d;
202
203    fn div(self, rhs: Vec4d) -> Self::Output {
204        Vec4d::new(self / rhs.x, self / rhs.y, self / rhs.z, self / rhs.w)
205    }
206}
207
208impl DivAssign<Vec4d> for Vec4d {
209    fn div_assign(&mut self, rhs: Vec4d) {
210        self.x /= rhs.x;
211        self.y /= rhs.y;
212        self.z /= rhs.z;
213        self.w /= rhs.w;
214    }
215}
216
217impl DivAssign<f64> for Vec4d {
218    fn div_assign(&mut self, rhs: f64) {
219        self.x /= rhs;
220        self.y /= rhs;
221        self.z /= rhs;
222        self.w /= rhs;
223    }
224}
225
226impl Neg for Vec4d {
227    type Output = Vec4d;
228
229    fn neg(self) -> Self::Output {
230        Self::new(-self.x, -self.y, -self.z, -self.w)
231    }
232}
233
234impl Index<usize> for Vec4d {
235    type Output = f64;
236
237    fn index(&self, index: usize) -> &Self::Output {
238        match index {
239            0 => &self.x,
240            1 => &self.y,
241            2 => &self.z,
242            3 => &self.w,
243            _ => panic!("`rmath::algebra::Vec4d::index`: index out of bounds."),
244        }
245    }
246}
247
248impl IndexMut<usize> for Vec4d {
249    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
250        match index {
251            0 => &mut self.x,
252            1 => &mut self.y,
253            2 => &mut self.z,
254            3 => &mut self.w,
255            _ => panic!("`rmath::algebra::Vec4d::index_mut`: index out of bounds."),
256        }
257    }
258}
259
260impl From<f64> for Vec4d {
261    fn from(v: f64) -> Self {
262        Self::new(v, v, v, v)
263    }
264}
265
266impl From<(f64, f64, f64, f64)> for Vec4d {
267    fn from(v: (f64, f64, f64, f64)) -> Self {
268        let (x, y, z, w) = v;
269        Self::new(x, y, z, w)
270    }
271}
272
273impl From<(Vec2d, f64, f64)> for Vec4d {
274    fn from(v: (Vec2d, f64, f64)) -> Self {
275        let (xy, z, w) = v;
276        let (x, y) = xy.to_tuple();
277        Self::new(x, y, z, w)
278    }
279}
280
281impl From<(Vec3d, f64)> for Vec4d {
282    fn from(v: (Vec3d, f64)) -> Self {
283        let (xyz, w) = v;
284        let (x, y, z) = xyz.to_tuple();
285        Self::new(x, y, z, w)
286    }
287}
288
289impl Vec4d {
290    pub fn new(x: f64, y: f64, z: f64, w: f64) -> Self {
291        Self { x, y, z, w }
292    }
293
294    pub fn one() -> Self {
295        Self::new(1.0, 1.0, 1.0, 1.0)
296    }
297
298    pub fn zero() -> Self {
299        Self::new(0.0, 0.0, 0.0, 0.0)
300    }
301}
302
303impl Vec4d {
304    pub fn floor(self) -> Self {
305        Self::new(
306            self.x.floor(),
307            self.y.floor(),
308            self.z.floor(),
309            self.w.floor(),
310        )
311    }
312
313    pub fn ceil(self) -> Self {
314        Self::new(self.x.ceil(), self.y.ceil(), self.z.ceil(), self.w.ceil())
315    }
316
317    pub fn round(self) -> Self {
318        Self::new(
319            self.x.round(),
320            self.y.round(),
321            self.z.round(),
322            self.w.round(),
323        )
324    }
325
326    pub fn trunc(self) -> Self {
327        Self::new(
328            self.x.trunc(),
329            self.y.trunc(),
330            self.z.trunc(),
331            self.w.trunc(),
332        )
333    }
334
335    pub fn fract(self) -> Self {
336        Self::new(
337            self.x.fract(),
338            self.y.fract(),
339            self.z.fract(),
340            self.w.fract(),
341        )
342    }
343
344    pub fn abs(self) -> Self {
345        Self::new(self.x.abs(), self.y.abs(), self.z.abs(), self.w.abs())
346    }
347
348    pub fn signum(self) -> Self {
349        Self::new(
350            self.x.signum(),
351            self.y.signum(),
352            self.z.signum(),
353            self.w.signum(),
354        )
355    }
356
357    pub fn powf(self, n: f64) -> Self {
358        Self::new(
359            self.x.powf(n),
360            self.y.powf(n),
361            self.z.powf(n),
362            self.w.powf(n),
363        )
364    }
365
366    pub fn sqrt(self) -> Self {
367        Self::new(self.x.sqrt(), self.y.sqrt(), self.z.sqrt(), self.w.sqrt())
368    }
369
370    pub fn exp(self) -> Self {
371        Self::new(self.x.exp(), self.y.exp(), self.z.exp(), self.w.exp())
372    }
373
374    pub fn exp2(self) -> Self {
375        Self::new(self.x.exp2(), self.y.exp2(), self.z.exp2(), self.w.exp2())
376    }
377
378    pub fn ln(self) -> Self {
379        Self::new(self.x.ln(), self.y.ln(), self.z.ln(), self.w.ln())
380    }
381
382    pub fn log(self, base: f64) -> Self {
383        Self::new(
384            self.x.log(base),
385            self.y.log(base),
386            self.z.log(base),
387            self.w.log(base),
388        )
389    }
390
391    pub fn log2(self) -> Self {
392        Self::new(self.x.log2(), self.y.log2(), self.z.log2(), self.w.log2())
393    }
394
395    pub fn log10(self) -> Self {
396        Self::new(
397            self.x.log10(),
398            self.y.log10(),
399            self.z.log10(),
400            self.w.log10(),
401        )
402    }
403
404    pub fn cbrt(self) -> Self {
405        Self::new(self.x.cbrt(), self.y.cbrt(), self.z.cbrt(), self.w.cbrt())
406    }
407
408    pub fn sin(self) -> Self {
409        Self::new(self.x.sin(), self.y.sin(), self.z.sin(), self.w.sin())
410    }
411
412    pub fn cos(self) -> Self {
413        Self::new(self.x.cos(), self.y.cos(), self.z.cos(), self.w.cos())
414    }
415
416    pub fn tan(self) -> Self {
417        Self::new(self.x.tan(), self.y.tan(), self.z.tan(), self.w.tan())
418    }
419
420    pub fn sin_cos(self) -> (Self, Self) {
421        (self.sin(), self.cos())
422    }
423
424    pub fn lerp(self, rhs: Self, s: f64) -> Self {
425        self + (rhs - self) * s
426    }
427
428    pub fn lerp_vec(self, rhs: Self, s: Self) -> Self {
429        self + (rhs - self) * s
430    }
431
432    pub fn is_nan(self) -> bool {
433        self.x.is_nan() || self.y.is_nan() || self.z.is_nan() || self.w.is_nan()
434    }
435
436    pub fn is_infinite(self) -> bool {
437        self.x.is_infinite() || self.y.is_infinite() || self.z.is_infinite() || self.w.is_infinite()
438    }
439
440    pub fn is_finite(self) -> bool {
441        self.x.is_finite() && self.y.is_finite() && self.z.is_finite() && self.w.is_finite()
442    }
443
444    pub fn recip(self) -> Self {
445        Self::new(
446            self.x.recip(),
447            self.y.recip(),
448            self.z.recip(),
449            self.w.recip(),
450        )
451    }
452
453    pub fn max(self, rhs: Self) -> Self {
454        Self::new(
455            self.x.max(rhs.x),
456            self.y.max(rhs.y),
457            self.z.max(rhs.z),
458            self.w.max(rhs.w),
459        )
460    }
461
462    pub fn min(self, rhs: Self) -> Self {
463        Self::new(
464            self.x.min(rhs.x),
465            self.y.min(rhs.y),
466            self.z.min(rhs.z),
467            self.w.min(rhs.w),
468        )
469    }
470
471    pub fn clamp(self, min: Self, max: Self) -> Self {
472        ruby_assert!(min.x <= max.x);
473        ruby_assert!(min.y <= max.y);
474        ruby_assert!(min.z <= max.z);
475        ruby_assert!(min.w <= max.w);
476
477        self.min(max).max(min)
478    }
479
480    pub fn saturate(self) -> Self {
481        self.clamp(Self::zero(), Self::one())
482    }
483
484    pub fn min_element(self) -> f64 {
485        self.x.min(self.y).min(self.z).min(self.w)
486    }
487
488    pub fn max_element(self) -> f64 {
489        self.x.max(self.y).max(self.z).max(self.w)
490    }
491}
492
493impl Vec4d {
494    pub fn dot(self, rhs: Self) -> f64 {
495        self.x * rhs.x + self.y * rhs.y + self.z * rhs.z + self.w * rhs.w
496    }
497
498    pub fn length(self) -> f64 {
499        self.dot(self).sqrt()
500    }
501
502    pub fn length_squared(self) -> f64 {
503        self.dot(self)
504    }
505
506    pub fn length_recip(self) -> f64 {
507        self.length().recip()
508    }
509
510    pub fn distance(self, rhs: Self) -> f64 {
511        (rhs - self).length()
512    }
513
514    pub fn distance_squared(self, rhs: Self) -> f64 {
515        (rhs - self).length_squared()
516    }
517
518    pub fn normalize(self) -> Self {
519        let normalized = self * self.length_recip();
520        ruby_assert!(normalized.is_finite());
521        normalized
522    }
523
524    pub fn try_normalize(self) -> Option<Self> {
525        let recip = self.length_recip();
526        if recip.is_finite() && recip > 0.0 {
527            Some(self * recip)
528        } else {
529            None
530        }
531    }
532
533    pub fn normalize_or_zero(self) -> Self {
534        let recip = self.length_recip();
535        if recip.is_finite() && recip > 0.0 {
536            self * recip
537        } else {
538            Self::zero()
539        }
540    }
541
542    pub fn is_normalized(self) -> bool {
543        (self.length_squared() - 1.0f64).abs() < f64::EPSILON
544    }
545}
546
547impl Vec4d {
548    pub fn to_array(self) -> [f64; 4] {
549        [self.x, self.y, self.z, self.w]
550    }
551
552    pub fn to_tuple(self) -> (f64, f64, f64, f64) {
553        (self.x, self.y, self.z, self.w)
554    }
555
556    pub fn to_vec4f(self) -> Vec4f {
557        vec4f(self.x as f32, self.y as f32, self.z as f32, self.w as f32)
558    }
559}
560
561impl Vec4d {
562    pub fn x(self) -> f64 {
563        self.x
564    }
565
566    pub fn y(self) -> f64 {
567        self.y
568    }
569
570    pub fn z(self) -> f64 {
571        self.z
572    }
573
574    pub fn w(self) -> f64 {
575        self.w
576    }
577
578    pub fn xx(self) -> Vec2d {
579        Vec2d::new(self.x, self.x)
580    }
581
582    pub fn xy(self) -> Vec2d {
583        Vec2d::new(self.x, self.y)
584    }
585
586    pub fn xz(self) -> Vec2d {
587        Vec2d::new(self.x, self.z)
588    }
589
590    pub fn xw(self) -> Vec2d {
591        Vec2d::new(self.x, self.w)
592    }
593
594    pub fn yx(self) -> Vec2d {
595        Vec2d::new(self.y, self.x)
596    }
597
598    pub fn yy(self) -> Vec2d {
599        Vec2d::new(self.y, self.y)
600    }
601
602    pub fn yz(self) -> Vec2d {
603        Vec2d::new(self.y, self.z)
604    }
605
606    pub fn yw(self) -> Vec2d {
607        Vec2d::new(self.y, self.w)
608    }
609
610    pub fn zx(self) -> Vec2d {
611        Vec2d::new(self.z, self.x)
612    }
613
614    pub fn zy(self) -> Vec2d {
615        Vec2d::new(self.z, self.y)
616    }
617
618    pub fn zz(self) -> Vec2d {
619        Vec2d::new(self.z, self.z)
620    }
621
622    pub fn zw(self) -> Vec2d {
623        Vec2d::new(self.z, self.w)
624    }
625
626    pub fn wx(self) -> Vec2d {
627        Vec2d::new(self.w, self.x)
628    }
629
630    pub fn wy(self) -> Vec2d {
631        Vec2d::new(self.w, self.y)
632    }
633
634    pub fn wz(self) -> Vec2d {
635        Vec2d::new(self.w, self.z)
636    }
637
638    pub fn ww(self) -> Vec2d {
639        Vec2d::new(self.w, self.w)
640    }
641
642    pub fn xxx(self) -> Vec3d {
643        Vec3d::new(self.x, self.x, self.x)
644    }
645
646    pub fn xxy(self) -> Vec3d {
647        Vec3d::new(self.x, self.x, self.y)
648    }
649
650    pub fn xxz(self) -> Vec3d {
651        Vec3d::new(self.x, self.x, self.z)
652    }
653
654    pub fn xxw(self) -> Vec3d {
655        Vec3d::new(self.x, self.x, self.w)
656    }
657
658    pub fn xyx(self) -> Vec3d {
659        Vec3d::new(self.x, self.y, self.x)
660    }
661
662    pub fn xyy(self) -> Vec3d {
663        Vec3d::new(self.x, self.y, self.y)
664    }
665
666    pub fn xyz(self) -> Vec3d {
667        Vec3d::new(self.x, self.y, self.z)
668    }
669
670    pub fn xyw(self) -> Vec3d {
671        Vec3d::new(self.x, self.y, self.w)
672    }
673
674    pub fn xzx(self) -> Vec3d {
675        Vec3d::new(self.x, self.z, self.x)
676    }
677
678    pub fn xzy(self) -> Vec3d {
679        Vec3d::new(self.x, self.z, self.y)
680    }
681
682    pub fn xzz(self) -> Vec3d {
683        Vec3d::new(self.x, self.z, self.z)
684    }
685
686    pub fn xzw(self) -> Vec3d {
687        Vec3d::new(self.x, self.z, self.w)
688    }
689
690    pub fn xwx(self) -> Vec3d {
691        Vec3d::new(self.x, self.w, self.x)
692    }
693
694    pub fn xwy(self) -> Vec3d {
695        Vec3d::new(self.x, self.w, self.y)
696    }
697
698    pub fn xwz(self) -> Vec3d {
699        Vec3d::new(self.x, self.w, self.z)
700    }
701
702    pub fn xww(self) -> Vec3d {
703        Vec3d::new(self.x, self.w, self.w)
704    }
705
706    pub fn yxx(self) -> Vec3d {
707        Vec3d::new(self.y, self.x, self.x)
708    }
709
710    pub fn yxy(self) -> Vec3d {
711        Vec3d::new(self.y, self.x, self.y)
712    }
713
714    pub fn yxz(self) -> Vec3d {
715        Vec3d::new(self.y, self.x, self.z)
716    }
717
718    pub fn yxw(self) -> Vec3d {
719        Vec3d::new(self.y, self.x, self.w)
720    }
721
722    pub fn yyx(self) -> Vec3d {
723        Vec3d::new(self.y, self.y, self.x)
724    }
725
726    pub fn yyy(self) -> Vec3d {
727        Vec3d::new(self.y, self.y, self.y)
728    }
729
730    pub fn yyz(self) -> Vec3d {
731        Vec3d::new(self.y, self.y, self.z)
732    }
733
734    pub fn yyw(self) -> Vec3d {
735        Vec3d::new(self.y, self.y, self.w)
736    }
737
738    pub fn yzx(self) -> Vec3d {
739        Vec3d::new(self.y, self.z, self.x)
740    }
741
742    pub fn yzy(self) -> Vec3d {
743        Vec3d::new(self.y, self.z, self.y)
744    }
745
746    pub fn yzz(self) -> Vec3d {
747        Vec3d::new(self.y, self.z, self.z)
748    }
749
750    pub fn yzw(self) -> Vec3d {
751        Vec3d::new(self.y, self.z, self.w)
752    }
753
754    pub fn ywx(self) -> Vec3d {
755        Vec3d::new(self.y, self.w, self.x)
756    }
757
758    pub fn ywy(self) -> Vec3d {
759        Vec3d::new(self.y, self.w, self.y)
760    }
761
762    pub fn ywz(self) -> Vec3d {
763        Vec3d::new(self.y, self.w, self.z)
764    }
765
766    pub fn yww(self) -> Vec3d {
767        Vec3d::new(self.y, self.w, self.w)
768    }
769
770    pub fn zxx(self) -> Vec3d {
771        Vec3d::new(self.z, self.x, self.x)
772    }
773
774    pub fn zxy(self) -> Vec3d {
775        Vec3d::new(self.z, self.x, self.y)
776    }
777
778    pub fn zxz(self) -> Vec3d {
779        Vec3d::new(self.z, self.x, self.z)
780    }
781
782    pub fn zxw(self) -> Vec3d {
783        Vec3d::new(self.z, self.x, self.w)
784    }
785
786    pub fn zyx(self) -> Vec3d {
787        Vec3d::new(self.z, self.y, self.x)
788    }
789
790    pub fn zyy(self) -> Vec3d {
791        Vec3d::new(self.z, self.y, self.y)
792    }
793
794    pub fn zyz(self) -> Vec3d {
795        Vec3d::new(self.z, self.y, self.z)
796    }
797
798    pub fn zyw(self) -> Vec3d {
799        Vec3d::new(self.z, self.y, self.w)
800    }
801
802    pub fn zzx(self) -> Vec3d {
803        Vec3d::new(self.z, self.z, self.x)
804    }
805
806    pub fn zzy(self) -> Vec3d {
807        Vec3d::new(self.z, self.z, self.y)
808    }
809
810    pub fn zzz(self) -> Vec3d {
811        Vec3d::new(self.z, self.z, self.z)
812    }
813
814    pub fn zzw(self) -> Vec3d {
815        Vec3d::new(self.z, self.z, self.w)
816    }
817
818    pub fn zwx(self) -> Vec3d {
819        Vec3d::new(self.z, self.w, self.x)
820    }
821
822    pub fn zwy(self) -> Vec3d {
823        Vec3d::new(self.z, self.w, self.y)
824    }
825
826    pub fn zwz(self) -> Vec3d {
827        Vec3d::new(self.z, self.w, self.z)
828    }
829
830    pub fn zww(self) -> Vec3d {
831        Vec3d::new(self.z, self.w, self.w)
832    }
833
834    pub fn wxx(self) -> Vec3d {
835        Vec3d::new(self.w, self.x, self.x)
836    }
837
838    pub fn wxy(self) -> Vec3d {
839        Vec3d::new(self.w, self.x, self.y)
840    }
841
842    pub fn wxz(self) -> Vec3d {
843        Vec3d::new(self.w, self.x, self.z)
844    }
845
846    pub fn wxw(self) -> Vec3d {
847        Vec3d::new(self.w, self.x, self.w)
848    }
849
850    pub fn wyx(self) -> Vec3d {
851        Vec3d::new(self.w, self.y, self.x)
852    }
853
854    pub fn wyy(self) -> Vec3d {
855        Vec3d::new(self.w, self.y, self.y)
856    }
857
858    pub fn wyz(self) -> Vec3d {
859        Vec3d::new(self.w, self.y, self.z)
860    }
861
862    pub fn wyw(self) -> Vec3d {
863        Vec3d::new(self.w, self.y, self.w)
864    }
865
866    pub fn wzx(self) -> Vec3d {
867        Vec3d::new(self.w, self.z, self.x)
868    }
869
870    pub fn wzy(self) -> Vec3d {
871        Vec3d::new(self.w, self.z, self.y)
872    }
873
874    pub fn wzz(self) -> Vec3d {
875        Vec3d::new(self.w, self.z, self.z)
876    }
877
878    pub fn wzw(self) -> Vec3d {
879        Vec3d::new(self.w, self.z, self.w)
880    }
881
882    pub fn wwx(self) -> Vec3d {
883        Vec3d::new(self.w, self.w, self.x)
884    }
885
886    pub fn wwy(self) -> Vec3d {
887        Vec3d::new(self.w, self.w, self.y)
888    }
889
890    pub fn wwz(self) -> Vec3d {
891        Vec3d::new(self.w, self.w, self.z)
892    }
893
894    pub fn www(self) -> Vec3d {
895        Vec3d::new(self.w, self.w, self.w)
896    }
897
898    pub fn xxxx(self) -> Self {
899        Self::new(self.x, self.x, self.x, self.x)
900    }
901
902    pub fn xxxy(self) -> Self {
903        Self::new(self.x, self.x, self.x, self.y)
904    }
905
906    pub fn xxxz(self) -> Self {
907        Self::new(self.x, self.x, self.x, self.z)
908    }
909
910    pub fn xxxw(self) -> Self {
911        Self::new(self.x, self.x, self.x, self.w)
912    }
913
914    pub fn xxyx(self) -> Self {
915        Self::new(self.x, self.x, self.y, self.x)
916    }
917
918    pub fn xxyy(self) -> Self {
919        Self::new(self.x, self.x, self.y, self.y)
920    }
921
922    pub fn xxyz(self) -> Self {
923        Self::new(self.x, self.x, self.y, self.z)
924    }
925
926    pub fn xxyw(self) -> Self {
927        Self::new(self.x, self.x, self.y, self.w)
928    }
929
930    pub fn xxzx(self) -> Self {
931        Self::new(self.x, self.x, self.z, self.x)
932    }
933
934    pub fn xxzy(self) -> Self {
935        Self::new(self.x, self.x, self.z, self.y)
936    }
937
938    pub fn xxzz(self) -> Self {
939        Self::new(self.x, self.x, self.z, self.z)
940    }
941
942    pub fn xxzw(self) -> Self {
943        Self::new(self.x, self.x, self.z, self.w)
944    }
945
946    pub fn xxwx(self) -> Self {
947        Self::new(self.x, self.x, self.w, self.x)
948    }
949
950    pub fn xxwy(self) -> Self {
951        Self::new(self.x, self.x, self.w, self.y)
952    }
953
954    pub fn xxwz(self) -> Self {
955        Self::new(self.x, self.x, self.w, self.z)
956    }
957
958    pub fn xxww(self) -> Self {
959        Self::new(self.x, self.x, self.w, self.w)
960    }
961
962    pub fn xyxx(self) -> Self {
963        Self::new(self.x, self.y, self.x, self.x)
964    }
965
966    pub fn xyxy(self) -> Self {
967        Self::new(self.x, self.y, self.x, self.y)
968    }
969
970    pub fn xyxz(self) -> Self {
971        Self::new(self.x, self.y, self.x, self.z)
972    }
973
974    pub fn xyxw(self) -> Self {
975        Self::new(self.x, self.y, self.x, self.w)
976    }
977
978    pub fn xyyx(self) -> Self {
979        Self::new(self.x, self.y, self.y, self.x)
980    }
981
982    pub fn xyyy(self) -> Self {
983        Self::new(self.x, self.y, self.y, self.y)
984    }
985
986    pub fn xyyz(self) -> Self {
987        Self::new(self.x, self.y, self.y, self.z)
988    }
989
990    pub fn xyyw(self) -> Self {
991        Self::new(self.x, self.y, self.y, self.w)
992    }
993
994    pub fn xyzx(self) -> Self {
995        Self::new(self.x, self.y, self.z, self.x)
996    }
997
998    pub fn xyzy(self) -> Self {
999        Self::new(self.x, self.y, self.z, self.y)
1000    }
1001
1002    pub fn xyzz(self) -> Self {
1003        Self::new(self.x, self.y, self.z, self.z)
1004    }
1005
1006    pub fn xyzw(self) -> Self {
1007        Self::new(self.x, self.y, self.z, self.w)
1008    }
1009
1010    pub fn xywx(self) -> Self {
1011        Self::new(self.x, self.y, self.w, self.x)
1012    }
1013
1014    pub fn xywy(self) -> Self {
1015        Self::new(self.x, self.y, self.w, self.y)
1016    }
1017
1018    pub fn xywz(self) -> Self {
1019        Self::new(self.x, self.y, self.w, self.z)
1020    }
1021
1022    pub fn xyww(self) -> Self {
1023        Self::new(self.x, self.y, self.w, self.w)
1024    }
1025
1026    pub fn xzxx(self) -> Self {
1027        Self::new(self.x, self.z, self.x, self.x)
1028    }
1029
1030    pub fn xzxy(self) -> Self {
1031        Self::new(self.x, self.z, self.x, self.y)
1032    }
1033
1034    pub fn xzxz(self) -> Self {
1035        Self::new(self.x, self.z, self.x, self.z)
1036    }
1037
1038    pub fn xzxw(self) -> Self {
1039        Self::new(self.x, self.z, self.x, self.w)
1040    }
1041
1042    pub fn xzyx(self) -> Self {
1043        Self::new(self.x, self.z, self.y, self.x)
1044    }
1045
1046    pub fn xzyy(self) -> Self {
1047        Self::new(self.x, self.z, self.y, self.y)
1048    }
1049
1050    pub fn xzyz(self) -> Self {
1051        Self::new(self.x, self.z, self.y, self.z)
1052    }
1053
1054    pub fn xzyw(self) -> Self {
1055        Self::new(self.x, self.z, self.y, self.w)
1056    }
1057
1058    pub fn xzzx(self) -> Self {
1059        Self::new(self.x, self.z, self.z, self.x)
1060    }
1061
1062    pub fn xzzy(self) -> Self {
1063        Self::new(self.x, self.z, self.z, self.y)
1064    }
1065
1066    pub fn xzzz(self) -> Self {
1067        Self::new(self.x, self.z, self.z, self.z)
1068    }
1069
1070    pub fn xzzw(self) -> Self {
1071        Self::new(self.x, self.z, self.z, self.w)
1072    }
1073
1074    pub fn xzwx(self) -> Self {
1075        Self::new(self.x, self.z, self.w, self.x)
1076    }
1077
1078    pub fn xzwy(self) -> Self {
1079        Self::new(self.x, self.z, self.w, self.y)
1080    }
1081
1082    pub fn xzwz(self) -> Self {
1083        Self::new(self.x, self.z, self.w, self.z)
1084    }
1085
1086    pub fn xzww(self) -> Self {
1087        Self::new(self.x, self.z, self.w, self.w)
1088    }
1089
1090    pub fn xwxx(self) -> Self {
1091        Self::new(self.x, self.w, self.x, self.x)
1092    }
1093
1094    pub fn xwxy(self) -> Self {
1095        Self::new(self.x, self.w, self.x, self.y)
1096    }
1097
1098    pub fn xwxz(self) -> Self {
1099        Self::new(self.x, self.w, self.x, self.z)
1100    }
1101
1102    pub fn xwxw(self) -> Self {
1103        Self::new(self.x, self.w, self.x, self.w)
1104    }
1105
1106    pub fn xwyx(self) -> Self {
1107        Self::new(self.x, self.w, self.y, self.x)
1108    }
1109
1110    pub fn xwyy(self) -> Self {
1111        Self::new(self.x, self.w, self.y, self.y)
1112    }
1113
1114    pub fn xwyz(self) -> Self {
1115        Self::new(self.x, self.w, self.y, self.z)
1116    }
1117
1118    pub fn xwyw(self) -> Self {
1119        Self::new(self.x, self.w, self.y, self.w)
1120    }
1121
1122    pub fn xwzx(self) -> Self {
1123        Self::new(self.x, self.w, self.z, self.x)
1124    }
1125
1126    pub fn xwzy(self) -> Self {
1127        Self::new(self.x, self.w, self.z, self.y)
1128    }
1129
1130    pub fn xwzz(self) -> Self {
1131        Self::new(self.x, self.w, self.z, self.z)
1132    }
1133
1134    pub fn xwzw(self) -> Self {
1135        Self::new(self.x, self.w, self.z, self.w)
1136    }
1137
1138    pub fn xwwx(self) -> Self {
1139        Self::new(self.x, self.w, self.w, self.x)
1140    }
1141
1142    pub fn xwwy(self) -> Self {
1143        Self::new(self.x, self.w, self.w, self.y)
1144    }
1145
1146    pub fn xwwz(self) -> Self {
1147        Self::new(self.x, self.w, self.w, self.z)
1148    }
1149
1150    pub fn xwww(self) -> Self {
1151        Self::new(self.x, self.w, self.w, self.w)
1152    }
1153
1154    pub fn yxxx(self) -> Self {
1155        Self::new(self.y, self.x, self.x, self.x)
1156    }
1157
1158    pub fn yxxy(self) -> Self {
1159        Self::new(self.y, self.x, self.x, self.y)
1160    }
1161
1162    pub fn yxxz(self) -> Self {
1163        Self::new(self.y, self.x, self.x, self.z)
1164    }
1165
1166    pub fn yxxw(self) -> Self {
1167        Self::new(self.y, self.x, self.x, self.w)
1168    }
1169
1170    pub fn yxyx(self) -> Self {
1171        Self::new(self.y, self.x, self.y, self.x)
1172    }
1173
1174    pub fn yxyy(self) -> Self {
1175        Self::new(self.y, self.x, self.y, self.y)
1176    }
1177
1178    pub fn yxyz(self) -> Self {
1179        Self::new(self.y, self.x, self.y, self.z)
1180    }
1181
1182    pub fn yxyw(self) -> Self {
1183        Self::new(self.y, self.x, self.y, self.w)
1184    }
1185
1186    pub fn yxzx(self) -> Self {
1187        Self::new(self.y, self.x, self.z, self.x)
1188    }
1189
1190    pub fn yxzy(self) -> Self {
1191        Self::new(self.y, self.x, self.z, self.y)
1192    }
1193
1194    pub fn yxzz(self) -> Self {
1195        Self::new(self.y, self.x, self.z, self.z)
1196    }
1197
1198    pub fn yxzw(self) -> Self {
1199        Self::new(self.y, self.x, self.z, self.w)
1200    }
1201
1202    pub fn yxwx(self) -> Self {
1203        Self::new(self.y, self.x, self.w, self.x)
1204    }
1205
1206    pub fn yxwy(self) -> Self {
1207        Self::new(self.y, self.x, self.w, self.y)
1208    }
1209
1210    pub fn yxwz(self) -> Self {
1211        Self::new(self.y, self.x, self.w, self.z)
1212    }
1213
1214    pub fn yxww(self) -> Self {
1215        Self::new(self.y, self.x, self.w, self.w)
1216    }
1217
1218    pub fn yyxx(self) -> Self {
1219        Self::new(self.y, self.y, self.x, self.x)
1220    }
1221
1222    pub fn yyxy(self) -> Self {
1223        Self::new(self.y, self.y, self.x, self.y)
1224    }
1225
1226    pub fn yyxz(self) -> Self {
1227        Self::new(self.y, self.y, self.x, self.z)
1228    }
1229
1230    pub fn yyxw(self) -> Self {
1231        Self::new(self.y, self.y, self.x, self.w)
1232    }
1233
1234    pub fn yyyx(self) -> Self {
1235        Self::new(self.y, self.y, self.y, self.x)
1236    }
1237
1238    pub fn yyyy(self) -> Self {
1239        Self::new(self.y, self.y, self.y, self.y)
1240    }
1241
1242    pub fn yyyz(self) -> Self {
1243        Self::new(self.y, self.y, self.y, self.z)
1244    }
1245
1246    pub fn yyyw(self) -> Self {
1247        Self::new(self.y, self.y, self.y, self.w)
1248    }
1249
1250    pub fn yyzx(self) -> Self {
1251        Self::new(self.y, self.y, self.z, self.x)
1252    }
1253
1254    pub fn yyzy(self) -> Self {
1255        Self::new(self.y, self.y, self.z, self.y)
1256    }
1257
1258    pub fn yyzz(self) -> Self {
1259        Self::new(self.y, self.y, self.z, self.z)
1260    }
1261
1262    pub fn yyzw(self) -> Self {
1263        Self::new(self.y, self.y, self.z, self.w)
1264    }
1265
1266    pub fn yywx(self) -> Self {
1267        Self::new(self.y, self.y, self.w, self.x)
1268    }
1269
1270    pub fn yywy(self) -> Self {
1271        Self::new(self.y, self.y, self.w, self.y)
1272    }
1273
1274    pub fn yywz(self) -> Self {
1275        Self::new(self.y, self.y, self.w, self.z)
1276    }
1277
1278    pub fn yyww(self) -> Self {
1279        Self::new(self.y, self.y, self.w, self.w)
1280    }
1281
1282    pub fn yzxx(self) -> Self {
1283        Self::new(self.y, self.z, self.x, self.x)
1284    }
1285
1286    pub fn yzxy(self) -> Self {
1287        Self::new(self.y, self.z, self.x, self.y)
1288    }
1289
1290    pub fn yzxz(self) -> Self {
1291        Self::new(self.y, self.z, self.x, self.z)
1292    }
1293
1294    pub fn yzxw(self) -> Self {
1295        Self::new(self.y, self.z, self.x, self.w)
1296    }
1297
1298    pub fn yzyx(self) -> Self {
1299        Self::new(self.y, self.z, self.y, self.x)
1300    }
1301
1302    pub fn yzyy(self) -> Self {
1303        Self::new(self.y, self.z, self.y, self.y)
1304    }
1305
1306    pub fn yzyz(self) -> Self {
1307        Self::new(self.y, self.z, self.y, self.z)
1308    }
1309
1310    pub fn yzyw(self) -> Self {
1311        Self::new(self.y, self.z, self.y, self.w)
1312    }
1313
1314    pub fn yzzx(self) -> Self {
1315        Self::new(self.y, self.z, self.z, self.x)
1316    }
1317
1318    pub fn yzzy(self) -> Self {
1319        Self::new(self.y, self.z, self.z, self.y)
1320    }
1321
1322    pub fn yzzz(self) -> Self {
1323        Self::new(self.y, self.z, self.z, self.z)
1324    }
1325
1326    pub fn yzzw(self) -> Self {
1327        Self::new(self.y, self.z, self.z, self.w)
1328    }
1329
1330    pub fn yzwx(self) -> Self {
1331        Self::new(self.y, self.z, self.w, self.x)
1332    }
1333
1334    pub fn yzwy(self) -> Self {
1335        Self::new(self.y, self.z, self.w, self.y)
1336    }
1337
1338    pub fn yzwz(self) -> Self {
1339        Self::new(self.y, self.z, self.w, self.z)
1340    }
1341
1342    pub fn yzww(self) -> Self {
1343        Self::new(self.y, self.z, self.w, self.w)
1344    }
1345
1346    pub fn ywxx(self) -> Self {
1347        Self::new(self.y, self.w, self.x, self.x)
1348    }
1349
1350    pub fn ywxy(self) -> Self {
1351        Self::new(self.y, self.w, self.x, self.y)
1352    }
1353
1354    pub fn ywxz(self) -> Self {
1355        Self::new(self.y, self.w, self.x, self.z)
1356    }
1357
1358    pub fn ywxw(self) -> Self {
1359        Self::new(self.y, self.w, self.x, self.w)
1360    }
1361
1362    pub fn ywyx(self) -> Self {
1363        Self::new(self.y, self.w, self.y, self.x)
1364    }
1365
1366    pub fn ywyy(self) -> Self {
1367        Self::new(self.y, self.w, self.y, self.y)
1368    }
1369
1370    pub fn ywyz(self) -> Self {
1371        Self::new(self.y, self.w, self.y, self.z)
1372    }
1373
1374    pub fn ywyw(self) -> Self {
1375        Self::new(self.y, self.w, self.y, self.w)
1376    }
1377
1378    pub fn ywzx(self) -> Self {
1379        Self::new(self.y, self.w, self.z, self.x)
1380    }
1381
1382    pub fn ywzy(self) -> Self {
1383        Self::new(self.y, self.w, self.z, self.y)
1384    }
1385
1386    pub fn ywzz(self) -> Self {
1387        Self::new(self.y, self.w, self.z, self.z)
1388    }
1389
1390    pub fn ywzw(self) -> Self {
1391        Self::new(self.y, self.w, self.z, self.w)
1392    }
1393
1394    pub fn ywwx(self) -> Self {
1395        Self::new(self.y, self.w, self.w, self.x)
1396    }
1397
1398    pub fn ywwy(self) -> Self {
1399        Self::new(self.y, self.w, self.w, self.y)
1400    }
1401
1402    pub fn ywwz(self) -> Self {
1403        Self::new(self.y, self.w, self.w, self.z)
1404    }
1405
1406    pub fn ywww(self) -> Self {
1407        Self::new(self.y, self.w, self.w, self.w)
1408    }
1409
1410    pub fn zxxx(self) -> Self {
1411        Self::new(self.z, self.x, self.x, self.x)
1412    }
1413
1414    pub fn zxxy(self) -> Self {
1415        Self::new(self.z, self.x, self.x, self.y)
1416    }
1417
1418    pub fn zxxz(self) -> Self {
1419        Self::new(self.z, self.x, self.x, self.z)
1420    }
1421
1422    pub fn zxxw(self) -> Self {
1423        Self::new(self.z, self.x, self.x, self.w)
1424    }
1425
1426    pub fn zxyx(self) -> Self {
1427        Self::new(self.z, self.x, self.y, self.x)
1428    }
1429
1430    pub fn zxyy(self) -> Self {
1431        Self::new(self.z, self.x, self.y, self.y)
1432    }
1433
1434    pub fn zxyz(self) -> Self {
1435        Self::new(self.z, self.x, self.y, self.z)
1436    }
1437
1438    pub fn zxyw(self) -> Self {
1439        Self::new(self.z, self.x, self.y, self.w)
1440    }
1441
1442    pub fn zxzx(self) -> Self {
1443        Self::new(self.z, self.x, self.z, self.x)
1444    }
1445
1446    pub fn zxzy(self) -> Self {
1447        Self::new(self.z, self.x, self.z, self.y)
1448    }
1449
1450    pub fn zxzz(self) -> Self {
1451        Self::new(self.z, self.x, self.z, self.z)
1452    }
1453
1454    pub fn zxzw(self) -> Self {
1455        Self::new(self.z, self.x, self.z, self.w)
1456    }
1457
1458    pub fn zxwx(self) -> Self {
1459        Self::new(self.z, self.x, self.w, self.x)
1460    }
1461
1462    pub fn zxwy(self) -> Self {
1463        Self::new(self.z, self.x, self.w, self.y)
1464    }
1465
1466    pub fn zxwz(self) -> Self {
1467        Self::new(self.z, self.x, self.w, self.z)
1468    }
1469
1470    pub fn zxww(self) -> Self {
1471        Self::new(self.z, self.x, self.w, self.w)
1472    }
1473
1474    pub fn zyxx(self) -> Self {
1475        Self::new(self.z, self.y, self.x, self.x)
1476    }
1477
1478    pub fn zyxy(self) -> Self {
1479        Self::new(self.z, self.y, self.x, self.y)
1480    }
1481
1482    pub fn zyxz(self) -> Self {
1483        Self::new(self.z, self.y, self.x, self.z)
1484    }
1485
1486    pub fn zyxw(self) -> Self {
1487        Self::new(self.z, self.y, self.x, self.w)
1488    }
1489
1490    pub fn zyyx(self) -> Self {
1491        Self::new(self.z, self.y, self.y, self.x)
1492    }
1493
1494    pub fn zyyy(self) -> Self {
1495        Self::new(self.z, self.y, self.y, self.y)
1496    }
1497
1498    pub fn zyyz(self) -> Self {
1499        Self::new(self.z, self.y, self.y, self.z)
1500    }
1501
1502    pub fn zyyw(self) -> Self {
1503        Self::new(self.z, self.y, self.y, self.w)
1504    }
1505
1506    pub fn zyzx(self) -> Self {
1507        Self::new(self.z, self.y, self.z, self.x)
1508    }
1509
1510    pub fn zyzy(self) -> Self {
1511        Self::new(self.z, self.y, self.z, self.y)
1512    }
1513
1514    pub fn zyzz(self) -> Self {
1515        Self::new(self.z, self.y, self.z, self.z)
1516    }
1517
1518    pub fn zyzw(self) -> Self {
1519        Self::new(self.z, self.y, self.z, self.w)
1520    }
1521
1522    pub fn zywx(self) -> Self {
1523        Self::new(self.z, self.y, self.w, self.x)
1524    }
1525
1526    pub fn zywy(self) -> Self {
1527        Self::new(self.z, self.y, self.w, self.y)
1528    }
1529
1530    pub fn zywz(self) -> Self {
1531        Self::new(self.z, self.y, self.w, self.z)
1532    }
1533
1534    pub fn zyww(self) -> Self {
1535        Self::new(self.z, self.y, self.w, self.w)
1536    }
1537
1538    pub fn zzxx(self) -> Self {
1539        Self::new(self.z, self.z, self.x, self.x)
1540    }
1541
1542    pub fn zzxy(self) -> Self {
1543        Self::new(self.z, self.z, self.x, self.y)
1544    }
1545
1546    pub fn zzxz(self) -> Self {
1547        Self::new(self.z, self.z, self.x, self.z)
1548    }
1549
1550    pub fn zzxw(self) -> Self {
1551        Self::new(self.z, self.z, self.x, self.w)
1552    }
1553
1554    pub fn zzyx(self) -> Self {
1555        Self::new(self.z, self.z, self.y, self.x)
1556    }
1557
1558    pub fn zzyy(self) -> Self {
1559        Self::new(self.z, self.z, self.y, self.y)
1560    }
1561
1562    pub fn zzyz(self) -> Self {
1563        Self::new(self.z, self.z, self.y, self.z)
1564    }
1565
1566    pub fn zzyw(self) -> Self {
1567        Self::new(self.z, self.z, self.y, self.w)
1568    }
1569
1570    pub fn zzzx(self) -> Self {
1571        Self::new(self.z, self.z, self.z, self.x)
1572    }
1573
1574    pub fn zzzy(self) -> Self {
1575        Self::new(self.z, self.z, self.z, self.y)
1576    }
1577
1578    pub fn zzzz(self) -> Self {
1579        Self::new(self.z, self.z, self.z, self.z)
1580    }
1581
1582    pub fn zzzw(self) -> Self {
1583        Self::new(self.z, self.z, self.z, self.w)
1584    }
1585
1586    pub fn zzwx(self) -> Self {
1587        Self::new(self.z, self.z, self.w, self.x)
1588    }
1589
1590    pub fn zzwy(self) -> Self {
1591        Self::new(self.z, self.z, self.w, self.y)
1592    }
1593
1594    pub fn zzwz(self) -> Self {
1595        Self::new(self.z, self.z, self.w, self.z)
1596    }
1597
1598    pub fn zzww(self) -> Self {
1599        Self::new(self.z, self.z, self.w, self.w)
1600    }
1601
1602    pub fn zwxx(self) -> Self {
1603        Self::new(self.z, self.w, self.x, self.x)
1604    }
1605
1606    pub fn zwxy(self) -> Self {
1607        Self::new(self.z, self.w, self.x, self.y)
1608    }
1609
1610    pub fn zwxz(self) -> Self {
1611        Self::new(self.z, self.w, self.x, self.z)
1612    }
1613
1614    pub fn zwxw(self) -> Self {
1615        Self::new(self.z, self.w, self.x, self.w)
1616    }
1617
1618    pub fn zwyx(self) -> Self {
1619        Self::new(self.z, self.w, self.y, self.x)
1620    }
1621
1622    pub fn zwyy(self) -> Self {
1623        Self::new(self.z, self.w, self.y, self.y)
1624    }
1625
1626    pub fn zwyz(self) -> Self {
1627        Self::new(self.z, self.w, self.y, self.z)
1628    }
1629
1630    pub fn zwyw(self) -> Self {
1631        Self::new(self.z, self.w, self.y, self.w)
1632    }
1633
1634    pub fn zwzx(self) -> Self {
1635        Self::new(self.z, self.w, self.z, self.x)
1636    }
1637
1638    pub fn zwzy(self) -> Self {
1639        Self::new(self.z, self.w, self.z, self.y)
1640    }
1641
1642    pub fn zwzz(self) -> Self {
1643        Self::new(self.z, self.w, self.z, self.z)
1644    }
1645
1646    pub fn zwzw(self) -> Self {
1647        Self::new(self.z, self.w, self.z, self.w)
1648    }
1649
1650    pub fn zwwx(self) -> Self {
1651        Self::new(self.z, self.w, self.w, self.x)
1652    }
1653
1654    pub fn zwwy(self) -> Self {
1655        Self::new(self.z, self.w, self.w, self.y)
1656    }
1657
1658    pub fn zwwz(self) -> Self {
1659        Self::new(self.z, self.w, self.w, self.z)
1660    }
1661
1662    pub fn zwww(self) -> Self {
1663        Self::new(self.z, self.w, self.w, self.w)
1664    }
1665
1666    pub fn wxxx(self) -> Self {
1667        Self::new(self.w, self.x, self.x, self.x)
1668    }
1669
1670    pub fn wxxy(self) -> Self {
1671        Self::new(self.w, self.x, self.x, self.y)
1672    }
1673
1674    pub fn wxxz(self) -> Self {
1675        Self::new(self.w, self.x, self.x, self.z)
1676    }
1677
1678    pub fn wxxw(self) -> Self {
1679        Self::new(self.w, self.x, self.x, self.w)
1680    }
1681
1682    pub fn wxyx(self) -> Self {
1683        Self::new(self.w, self.x, self.y, self.x)
1684    }
1685
1686    pub fn wxyy(self) -> Self {
1687        Self::new(self.w, self.x, self.y, self.y)
1688    }
1689
1690    pub fn wxyz(self) -> Self {
1691        Self::new(self.w, self.x, self.y, self.z)
1692    }
1693
1694    pub fn wxyw(self) -> Self {
1695        Self::new(self.w, self.x, self.y, self.w)
1696    }
1697
1698    pub fn wxzx(self) -> Self {
1699        Self::new(self.w, self.x, self.z, self.x)
1700    }
1701
1702    pub fn wxzy(self) -> Self {
1703        Self::new(self.w, self.x, self.z, self.y)
1704    }
1705
1706    pub fn wxzz(self) -> Self {
1707        Self::new(self.w, self.x, self.z, self.z)
1708    }
1709
1710    pub fn wxzw(self) -> Self {
1711        Self::new(self.w, self.x, self.z, self.w)
1712    }
1713
1714    pub fn wxwx(self) -> Self {
1715        Self::new(self.w, self.x, self.w, self.x)
1716    }
1717
1718    pub fn wxwy(self) -> Self {
1719        Self::new(self.w, self.x, self.w, self.y)
1720    }
1721
1722    pub fn wxwz(self) -> Self {
1723        Self::new(self.w, self.x, self.w, self.z)
1724    }
1725
1726    pub fn wxww(self) -> Self {
1727        Self::new(self.w, self.x, self.w, self.w)
1728    }
1729
1730    pub fn wyxx(self) -> Self {
1731        Self::new(self.w, self.y, self.x, self.x)
1732    }
1733
1734    pub fn wyxy(self) -> Self {
1735        Self::new(self.w, self.y, self.x, self.y)
1736    }
1737
1738    pub fn wyxz(self) -> Self {
1739        Self::new(self.w, self.y, self.x, self.z)
1740    }
1741
1742    pub fn wyxw(self) -> Self {
1743        Self::new(self.w, self.y, self.x, self.w)
1744    }
1745
1746    pub fn wyyx(self) -> Self {
1747        Self::new(self.w, self.y, self.y, self.x)
1748    }
1749
1750    pub fn wyyy(self) -> Self {
1751        Self::new(self.w, self.y, self.y, self.y)
1752    }
1753
1754    pub fn wyyz(self) -> Self {
1755        Self::new(self.w, self.y, self.y, self.z)
1756    }
1757
1758    pub fn wyyw(self) -> Self {
1759        Self::new(self.w, self.y, self.y, self.w)
1760    }
1761
1762    pub fn wyzx(self) -> Self {
1763        Self::new(self.w, self.y, self.z, self.x)
1764    }
1765
1766    pub fn wyzy(self) -> Self {
1767        Self::new(self.w, self.y, self.z, self.y)
1768    }
1769
1770    pub fn wyzz(self) -> Self {
1771        Self::new(self.w, self.y, self.z, self.z)
1772    }
1773
1774    pub fn wyzw(self) -> Self {
1775        Self::new(self.w, self.y, self.z, self.w)
1776    }
1777
1778    pub fn wywx(self) -> Self {
1779        Self::new(self.w, self.y, self.w, self.x)
1780    }
1781
1782    pub fn wywy(self) -> Self {
1783        Self::new(self.w, self.y, self.w, self.y)
1784    }
1785
1786    pub fn wywz(self) -> Self {
1787        Self::new(self.w, self.y, self.w, self.z)
1788    }
1789
1790    pub fn wyww(self) -> Self {
1791        Self::new(self.w, self.y, self.w, self.w)
1792    }
1793
1794    pub fn wzxx(self) -> Self {
1795        Self::new(self.w, self.z, self.x, self.x)
1796    }
1797
1798    pub fn wzxy(self) -> Self {
1799        Self::new(self.w, self.z, self.x, self.y)
1800    }
1801
1802    pub fn wzxz(self) -> Self {
1803        Self::new(self.w, self.z, self.x, self.z)
1804    }
1805
1806    pub fn wzxw(self) -> Self {
1807        Self::new(self.w, self.z, self.x, self.w)
1808    }
1809
1810    pub fn wzyx(self) -> Self {
1811        Self::new(self.w, self.z, self.y, self.x)
1812    }
1813
1814    pub fn wzyy(self) -> Self {
1815        Self::new(self.w, self.z, self.y, self.y)
1816    }
1817
1818    pub fn wzyz(self) -> Self {
1819        Self::new(self.w, self.z, self.y, self.z)
1820    }
1821
1822    pub fn wzyw(self) -> Self {
1823        Self::new(self.w, self.z, self.y, self.w)
1824    }
1825
1826    pub fn wzzx(self) -> Self {
1827        Self::new(self.w, self.z, self.z, self.x)
1828    }
1829
1830    pub fn wzzy(self) -> Self {
1831        Self::new(self.w, self.z, self.z, self.y)
1832    }
1833
1834    pub fn wzzz(self) -> Self {
1835        Self::new(self.w, self.z, self.z, self.z)
1836    }
1837
1838    pub fn wzzw(self) -> Self {
1839        Self::new(self.w, self.z, self.z, self.w)
1840    }
1841
1842    pub fn wzwx(self) -> Self {
1843        Self::new(self.w, self.z, self.w, self.x)
1844    }
1845
1846    pub fn wzwy(self) -> Self {
1847        Self::new(self.w, self.z, self.w, self.y)
1848    }
1849
1850    pub fn wzwz(self) -> Self {
1851        Self::new(self.w, self.z, self.w, self.z)
1852    }
1853
1854    pub fn wzww(self) -> Self {
1855        Self::new(self.w, self.z, self.w, self.w)
1856    }
1857
1858    pub fn wwxx(self) -> Self {
1859        Self::new(self.w, self.w, self.x, self.x)
1860    }
1861
1862    pub fn wwxy(self) -> Self {
1863        Self::new(self.w, self.w, self.x, self.y)
1864    }
1865
1866    pub fn wwxz(self) -> Self {
1867        Self::new(self.w, self.w, self.x, self.z)
1868    }
1869
1870    pub fn wwxw(self) -> Self {
1871        Self::new(self.w, self.w, self.x, self.w)
1872    }
1873
1874    pub fn wwyx(self) -> Self {
1875        Self::new(self.w, self.w, self.y, self.x)
1876    }
1877
1878    pub fn wwyy(self) -> Self {
1879        Self::new(self.w, self.w, self.y, self.y)
1880    }
1881
1882    pub fn wwyz(self) -> Self {
1883        Self::new(self.w, self.w, self.y, self.z)
1884    }
1885
1886    pub fn wwyw(self) -> Self {
1887        Self::new(self.w, self.w, self.y, self.w)
1888    }
1889
1890    pub fn wwzx(self) -> Self {
1891        Self::new(self.w, self.w, self.z, self.x)
1892    }
1893
1894    pub fn wwzy(self) -> Self {
1895        Self::new(self.w, self.w, self.z, self.y)
1896    }
1897
1898    pub fn wwzz(self) -> Self {
1899        Self::new(self.w, self.w, self.z, self.z)
1900    }
1901
1902    pub fn wwzw(self) -> Self {
1903        Self::new(self.w, self.w, self.z, self.w)
1904    }
1905
1906    pub fn wwwx(self) -> Self {
1907        Self::new(self.w, self.w, self.w, self.x)
1908    }
1909
1910    pub fn wwwy(self) -> Self {
1911        Self::new(self.w, self.w, self.w, self.y)
1912    }
1913
1914    pub fn wwwz(self) -> Self {
1915        Self::new(self.w, self.w, self.w, self.z)
1916    }
1917
1918    pub fn wwww(self) -> Self {
1919        Self::new(self.w, self.w, self.w, self.w)
1920    }
1921}