1use crate::{f32::math, BVec3, BVec3A, Vec2, Vec4};
4
5#[cfg(not(target_arch = "spirv"))]
6use core::fmt;
7use core::iter::{Product, Sum};
8use core::{f32, ops::*};
9
10#[inline(always)]
12#[must_use]
13pub const fn vec3(x: f32, y: f32, z: f32) -> Vec3 {
14 Vec3::new(x, y, z)
15}
16
17#[derive(Clone, Copy, PartialEq)]
19#[cfg_attr(not(target_arch = "spirv"), repr(C))]
20#[cfg_attr(target_arch = "spirv", repr(simd))]
21pub struct Vec3 {
22 pub x: f32,
23 pub y: f32,
24 pub z: f32,
25}
26
27impl Vec3 {
28 pub const ZERO: Self = Self::splat(0.0);
30
31 pub const ONE: Self = Self::splat(1.0);
33
34 pub const NEG_ONE: Self = Self::splat(-1.0);
36
37 pub const MIN: Self = Self::splat(f32::MIN);
39
40 pub const MAX: Self = Self::splat(f32::MAX);
42
43 pub const NAN: Self = Self::splat(f32::NAN);
45
46 pub const INFINITY: Self = Self::splat(f32::INFINITY);
48
49 pub const NEG_INFINITY: Self = Self::splat(f32::NEG_INFINITY);
51
52 pub const X: Self = Self::new(1.0, 0.0, 0.0);
54
55 pub const Y: Self = Self::new(0.0, 1.0, 0.0);
57
58 pub const Z: Self = Self::new(0.0, 0.0, 1.0);
60
61 pub const NEG_X: Self = Self::new(-1.0, 0.0, 0.0);
63
64 pub const NEG_Y: Self = Self::new(0.0, -1.0, 0.0);
66
67 pub const NEG_Z: Self = Self::new(0.0, 0.0, -1.0);
69
70 pub const AXES: [Self; 3] = [Self::X, Self::Y, Self::Z];
72
73 #[inline(always)]
75 #[must_use]
76 pub const fn new(x: f32, y: f32, z: f32) -> Self {
77 Self { x, y, z }
78 }
79
80 #[inline]
82 #[must_use]
83 pub const fn splat(v: f32) -> Self {
84 Self { x: v, y: v, z: v }
85 }
86
87 #[inline]
93 #[must_use]
94 pub fn select(mask: BVec3, if_true: Self, if_false: Self) -> Self {
95 Self {
96 x: if mask.test(0) { if_true.x } else { if_false.x },
97 y: if mask.test(1) { if_true.y } else { if_false.y },
98 z: if mask.test(2) { if_true.z } else { if_false.z },
99 }
100 }
101
102 #[inline]
104 #[must_use]
105 pub const fn from_array(a: [f32; 3]) -> Self {
106 Self::new(a[0], a[1], a[2])
107 }
108
109 #[inline]
111 #[must_use]
112 pub const fn to_array(&self) -> [f32; 3] {
113 [self.x, self.y, self.z]
114 }
115
116 #[inline]
122 #[must_use]
123 pub const fn from_slice(slice: &[f32]) -> Self {
124 Self::new(slice[0], slice[1], slice[2])
125 }
126
127 #[inline]
133 pub fn write_to_slice(self, slice: &mut [f32]) {
134 slice[0] = self.x;
135 slice[1] = self.y;
136 slice[2] = self.z;
137 }
138
139 #[allow(dead_code)]
141 #[inline]
142 #[must_use]
143 pub(crate) fn from_vec4(v: Vec4) -> Self {
144 Self {
145 x: v.x,
146 y: v.y,
147 z: v.z,
148 }
149 }
150
151 #[inline]
153 #[must_use]
154 pub fn extend(self, w: f32) -> Vec4 {
155 Vec4::new(self.x, self.y, self.z, w)
156 }
157
158 #[inline]
162 #[must_use]
163 pub fn truncate(self) -> Vec2 {
164 use crate::swizzles::Vec3Swizzles;
165 self.xy()
166 }
167
168 #[inline]
170 #[must_use]
171 pub fn with_x(mut self, x: f32) -> Self {
172 self.x = x;
173 self
174 }
175
176 #[inline]
178 #[must_use]
179 pub fn with_y(mut self, y: f32) -> Self {
180 self.y = y;
181 self
182 }
183
184 #[inline]
186 #[must_use]
187 pub fn with_z(mut self, z: f32) -> Self {
188 self.z = z;
189 self
190 }
191
192 #[inline]
194 #[must_use]
195 pub fn dot(self, rhs: Self) -> f32 {
196 (self.x * rhs.x) + (self.y * rhs.y) + (self.z * rhs.z)
197 }
198
199 #[inline]
201 #[must_use]
202 pub fn dot_into_vec(self, rhs: Self) -> Self {
203 Self::splat(self.dot(rhs))
204 }
205
206 #[inline]
208 #[must_use]
209 pub fn cross(self, rhs: Self) -> Self {
210 Self {
211 x: self.y * rhs.z - rhs.y * self.z,
212 y: self.z * rhs.x - rhs.z * self.x,
213 z: self.x * rhs.y - rhs.x * self.y,
214 }
215 }
216
217 #[inline]
221 #[must_use]
222 pub fn min(self, rhs: Self) -> Self {
223 Self {
224 x: self.x.min(rhs.x),
225 y: self.y.min(rhs.y),
226 z: self.z.min(rhs.z),
227 }
228 }
229
230 #[inline]
234 #[must_use]
235 pub fn max(self, rhs: Self) -> Self {
236 Self {
237 x: self.x.max(rhs.x),
238 y: self.y.max(rhs.y),
239 z: self.z.max(rhs.z),
240 }
241 }
242
243 #[inline]
251 #[must_use]
252 pub fn clamp(self, min: Self, max: Self) -> Self {
253 glam_assert!(min.cmple(max).all(), "clamp: expected min <= max");
254 self.max(min).min(max)
255 }
256
257 #[inline]
261 #[must_use]
262 pub fn min_element(self) -> f32 {
263 self.x.min(self.y.min(self.z))
264 }
265
266 #[inline]
270 #[must_use]
271 pub fn max_element(self) -> f32 {
272 self.x.max(self.y.max(self.z))
273 }
274
275 #[inline]
279 #[must_use]
280 pub fn element_sum(self) -> f32 {
281 self.x + self.y + self.z
282 }
283
284 #[inline]
288 #[must_use]
289 pub fn element_product(self) -> f32 {
290 self.x * self.y * self.z
291 }
292
293 #[inline]
299 #[must_use]
300 pub fn cmpeq(self, rhs: Self) -> BVec3 {
301 BVec3::new(self.x.eq(&rhs.x), self.y.eq(&rhs.y), self.z.eq(&rhs.z))
302 }
303
304 #[inline]
310 #[must_use]
311 pub fn cmpne(self, rhs: Self) -> BVec3 {
312 BVec3::new(self.x.ne(&rhs.x), self.y.ne(&rhs.y), self.z.ne(&rhs.z))
313 }
314
315 #[inline]
321 #[must_use]
322 pub fn cmpge(self, rhs: Self) -> BVec3 {
323 BVec3::new(self.x.ge(&rhs.x), self.y.ge(&rhs.y), self.z.ge(&rhs.z))
324 }
325
326 #[inline]
332 #[must_use]
333 pub fn cmpgt(self, rhs: Self) -> BVec3 {
334 BVec3::new(self.x.gt(&rhs.x), self.y.gt(&rhs.y), self.z.gt(&rhs.z))
335 }
336
337 #[inline]
343 #[must_use]
344 pub fn cmple(self, rhs: Self) -> BVec3 {
345 BVec3::new(self.x.le(&rhs.x), self.y.le(&rhs.y), self.z.le(&rhs.z))
346 }
347
348 #[inline]
354 #[must_use]
355 pub fn cmplt(self, rhs: Self) -> BVec3 {
356 BVec3::new(self.x.lt(&rhs.x), self.y.lt(&rhs.y), self.z.lt(&rhs.z))
357 }
358
359 #[inline]
361 #[must_use]
362 pub fn abs(self) -> Self {
363 Self {
364 x: math::abs(self.x),
365 y: math::abs(self.y),
366 z: math::abs(self.z),
367 }
368 }
369
370 #[inline]
376 #[must_use]
377 pub fn signum(self) -> Self {
378 Self {
379 x: math::signum(self.x),
380 y: math::signum(self.y),
381 z: math::signum(self.z),
382 }
383 }
384
385 #[inline]
387 #[must_use]
388 pub fn copysign(self, rhs: Self) -> Self {
389 Self {
390 x: math::copysign(self.x, rhs.x),
391 y: math::copysign(self.y, rhs.y),
392 z: math::copysign(self.z, rhs.z),
393 }
394 }
395
396 #[inline]
401 #[must_use]
402 pub fn is_negative_bitmask(self) -> u32 {
403 (self.x.is_sign_negative() as u32)
404 | (self.y.is_sign_negative() as u32) << 1
405 | (self.z.is_sign_negative() as u32) << 2
406 }
407
408 #[inline]
411 #[must_use]
412 pub fn is_finite(self) -> bool {
413 self.x.is_finite() && self.y.is_finite() && self.z.is_finite()
414 }
415
416 #[inline]
418 #[must_use]
419 pub fn is_nan(self) -> bool {
420 self.x.is_nan() || self.y.is_nan() || self.z.is_nan()
421 }
422
423 #[inline]
427 #[must_use]
428 pub fn is_nan_mask(self) -> BVec3 {
429 BVec3::new(self.x.is_nan(), self.y.is_nan(), self.z.is_nan())
430 }
431
432 #[doc(alias = "magnitude")]
434 #[inline]
435 #[must_use]
436 pub fn length(self) -> f32 {
437 math::sqrt(self.dot(self))
438 }
439
440 #[doc(alias = "magnitude2")]
444 #[inline]
445 #[must_use]
446 pub fn length_squared(self) -> f32 {
447 self.dot(self)
448 }
449
450 #[inline]
454 #[must_use]
455 pub fn length_recip(self) -> f32 {
456 self.length().recip()
457 }
458
459 #[inline]
461 #[must_use]
462 pub fn distance(self, rhs: Self) -> f32 {
463 (self - rhs).length()
464 }
465
466 #[inline]
468 #[must_use]
469 pub fn distance_squared(self, rhs: Self) -> f32 {
470 (self - rhs).length_squared()
471 }
472
473 #[inline]
475 #[must_use]
476 pub fn div_euclid(self, rhs: Self) -> Self {
477 Self::new(
478 math::div_euclid(self.x, rhs.x),
479 math::div_euclid(self.y, rhs.y),
480 math::div_euclid(self.z, rhs.z),
481 )
482 }
483
484 #[inline]
488 #[must_use]
489 pub fn rem_euclid(self, rhs: Self) -> Self {
490 Self::new(
491 math::rem_euclid(self.x, rhs.x),
492 math::rem_euclid(self.y, rhs.y),
493 math::rem_euclid(self.z, rhs.z),
494 )
495 }
496
497 #[inline]
507 #[must_use]
508 pub fn normalize(self) -> Self {
509 #[allow(clippy::let_and_return)]
510 let normalized = self.mul(self.length_recip());
511 glam_assert!(normalized.is_finite());
512 normalized
513 }
514
515 #[inline]
522 #[must_use]
523 pub fn try_normalize(self) -> Option<Self> {
524 let rcp = self.length_recip();
525 if rcp.is_finite() && rcp > 0.0 {
526 Some(self * rcp)
527 } else {
528 None
529 }
530 }
531
532 #[inline]
540 #[must_use]
541 pub fn normalize_or(self, fallback: Self) -> Self {
542 let rcp = self.length_recip();
543 if rcp.is_finite() && rcp > 0.0 {
544 self * rcp
545 } else {
546 fallback
547 }
548 }
549
550 #[inline]
557 #[must_use]
558 pub fn normalize_or_zero(self) -> Self {
559 self.normalize_or(Self::ZERO)
560 }
561
562 #[inline]
566 #[must_use]
567 pub fn is_normalized(self) -> bool {
568 math::abs(self.length_squared() - 1.0) <= 2e-4
569 }
570
571 #[inline]
579 #[must_use]
580 pub fn project_onto(self, rhs: Self) -> Self {
581 let other_len_sq_rcp = rhs.dot(rhs).recip();
582 glam_assert!(other_len_sq_rcp.is_finite());
583 rhs * self.dot(rhs) * other_len_sq_rcp
584 }
585
586 #[inline]
597 #[must_use]
598 pub fn reject_from(self, rhs: Self) -> Self {
599 self - self.project_onto(rhs)
600 }
601
602 #[inline]
610 #[must_use]
611 pub fn project_onto_normalized(self, rhs: Self) -> Self {
612 glam_assert!(rhs.is_normalized());
613 rhs * self.dot(rhs)
614 }
615
616 #[inline]
627 #[must_use]
628 pub fn reject_from_normalized(self, rhs: Self) -> Self {
629 self - self.project_onto_normalized(rhs)
630 }
631
632 #[inline]
635 #[must_use]
636 pub fn round(self) -> Self {
637 Self {
638 x: math::round(self.x),
639 y: math::round(self.y),
640 z: math::round(self.z),
641 }
642 }
643
644 #[inline]
647 #[must_use]
648 pub fn floor(self) -> Self {
649 Self {
650 x: math::floor(self.x),
651 y: math::floor(self.y),
652 z: math::floor(self.z),
653 }
654 }
655
656 #[inline]
659 #[must_use]
660 pub fn ceil(self) -> Self {
661 Self {
662 x: math::ceil(self.x),
663 y: math::ceil(self.y),
664 z: math::ceil(self.z),
665 }
666 }
667
668 #[inline]
671 #[must_use]
672 pub fn trunc(self) -> Self {
673 Self {
674 x: math::trunc(self.x),
675 y: math::trunc(self.y),
676 z: math::trunc(self.z),
677 }
678 }
679
680 #[inline]
687 #[must_use]
688 pub fn fract(self) -> Self {
689 self - self.trunc()
690 }
691
692 #[inline]
699 #[must_use]
700 pub fn fract_gl(self) -> Self {
701 self - self.floor()
702 }
703
704 #[inline]
707 #[must_use]
708 pub fn exp(self) -> Self {
709 Self::new(math::exp(self.x), math::exp(self.y), math::exp(self.z))
710 }
711
712 #[inline]
714 #[must_use]
715 pub fn powf(self, n: f32) -> Self {
716 Self::new(
717 math::powf(self.x, n),
718 math::powf(self.y, n),
719 math::powf(self.z, n),
720 )
721 }
722
723 #[inline]
725 #[must_use]
726 pub fn recip(self) -> Self {
727 Self {
728 x: 1.0 / self.x,
729 y: 1.0 / self.y,
730 z: 1.0 / self.z,
731 }
732 }
733
734 #[doc(alias = "mix")]
740 #[inline]
741 #[must_use]
742 pub fn lerp(self, rhs: Self, s: f32) -> Self {
743 self + ((rhs - self) * s)
744 }
745
746 #[inline]
751 #[must_use]
752 pub fn move_towards(&self, rhs: Self, d: f32) -> Self {
753 let a = rhs - *self;
754 let len = a.length();
755 if len <= d || len <= 1e-4 {
756 return rhs;
757 }
758 *self + a / len * d
759 }
760
761 #[inline]
767 pub fn midpoint(self, rhs: Self) -> Self {
768 (self + rhs) * 0.5
769 }
770
771 #[inline]
781 #[must_use]
782 pub fn abs_diff_eq(self, rhs: Self, max_abs_diff: f32) -> bool {
783 self.sub(rhs).abs().cmple(Self::splat(max_abs_diff)).all()
784 }
785
786 #[inline]
792 #[must_use]
793 pub fn clamp_length(self, min: f32, max: f32) -> Self {
794 glam_assert!(min <= max);
795 let length_sq = self.length_squared();
796 if length_sq < min * min {
797 min * (self / math::sqrt(length_sq))
798 } else if length_sq > max * max {
799 max * (self / math::sqrt(length_sq))
800 } else {
801 self
802 }
803 }
804
805 #[inline]
807 #[must_use]
808 pub fn clamp_length_max(self, max: f32) -> Self {
809 let length_sq = self.length_squared();
810 if length_sq > max * max {
811 max * (self / math::sqrt(length_sq))
812 } else {
813 self
814 }
815 }
816
817 #[inline]
819 #[must_use]
820 pub fn clamp_length_min(self, min: f32) -> Self {
821 let length_sq = self.length_squared();
822 if length_sq < min * min {
823 min * (self / math::sqrt(length_sq))
824 } else {
825 self
826 }
827 }
828
829 #[inline]
837 #[must_use]
838 pub fn mul_add(self, a: Self, b: Self) -> Self {
839 Self::new(
840 math::mul_add(self.x, a.x, b.x),
841 math::mul_add(self.y, a.y, b.y),
842 math::mul_add(self.z, a.z, b.z),
843 )
844 }
845
846 #[inline]
850 #[must_use]
851 pub fn angle_between(self, rhs: Self) -> f32 {
852 math::acos_approx(
853 self.dot(rhs)
854 .div(math::sqrt(self.length_squared().mul(rhs.length_squared()))),
855 )
856 }
857
858 #[inline]
865 #[must_use]
866 pub fn any_orthogonal_vector(&self) -> Self {
867 if math::abs(self.x) > math::abs(self.y) {
869 Self::new(-self.z, 0.0, self.x) } else {
871 Self::new(0.0, self.z, -self.y) }
873 }
874
875 #[inline]
883 #[must_use]
884 pub fn any_orthonormal_vector(&self) -> Self {
885 glam_assert!(self.is_normalized());
886 let sign = math::signum(self.z);
888 let a = -1.0 / (sign + self.z);
889 let b = self.x * self.y * a;
890 Self::new(b, sign + self.y * self.y * a, -self.y)
891 }
892
893 #[inline]
900 #[must_use]
901 pub fn any_orthonormal_pair(&self) -> (Self, Self) {
902 glam_assert!(self.is_normalized());
903 let sign = math::signum(self.z);
905 let a = -1.0 / (sign + self.z);
906 let b = self.x * self.y * a;
907 (
908 Self::new(1.0 + sign * self.x * self.x * a, sign * b, -sign * self.x),
909 Self::new(b, sign + self.y * self.y * a, -self.y),
910 )
911 }
912
913 #[inline]
915 #[must_use]
916 pub fn as_dvec3(&self) -> crate::DVec3 {
917 crate::DVec3::new(self.x as f64, self.y as f64, self.z as f64)
918 }
919
920 #[inline]
922 #[must_use]
923 pub fn as_i16vec3(&self) -> crate::I16Vec3 {
924 crate::I16Vec3::new(self.x as i16, self.y as i16, self.z as i16)
925 }
926
927 #[inline]
929 #[must_use]
930 pub fn as_u16vec3(&self) -> crate::U16Vec3 {
931 crate::U16Vec3::new(self.x as u16, self.y as u16, self.z as u16)
932 }
933
934 #[inline]
936 #[must_use]
937 pub fn as_ivec3(&self) -> crate::IVec3 {
938 crate::IVec3::new(self.x as i32, self.y as i32, self.z as i32)
939 }
940
941 #[inline]
943 #[must_use]
944 pub fn as_uvec3(&self) -> crate::UVec3 {
945 crate::UVec3::new(self.x as u32, self.y as u32, self.z as u32)
946 }
947
948 #[inline]
950 #[must_use]
951 pub fn as_i64vec3(&self) -> crate::I64Vec3 {
952 crate::I64Vec3::new(self.x as i64, self.y as i64, self.z as i64)
953 }
954
955 #[inline]
957 #[must_use]
958 pub fn as_u64vec3(&self) -> crate::U64Vec3 {
959 crate::U64Vec3::new(self.x as u64, self.y as u64, self.z as u64)
960 }
961}
962
963impl Default for Vec3 {
964 #[inline(always)]
965 fn default() -> Self {
966 Self::ZERO
967 }
968}
969
970impl Div<Vec3> for Vec3 {
971 type Output = Self;
972 #[inline]
973 fn div(self, rhs: Self) -> Self {
974 Self {
975 x: self.x.div(rhs.x),
976 y: self.y.div(rhs.y),
977 z: self.z.div(rhs.z),
978 }
979 }
980}
981
982impl DivAssign<Vec3> for Vec3 {
983 #[inline]
984 fn div_assign(&mut self, rhs: Self) {
985 self.x.div_assign(rhs.x);
986 self.y.div_assign(rhs.y);
987 self.z.div_assign(rhs.z);
988 }
989}
990
991impl Div<f32> for Vec3 {
992 type Output = Self;
993 #[inline]
994 fn div(self, rhs: f32) -> Self {
995 Self {
996 x: self.x.div(rhs),
997 y: self.y.div(rhs),
998 z: self.z.div(rhs),
999 }
1000 }
1001}
1002
1003impl DivAssign<f32> for Vec3 {
1004 #[inline]
1005 fn div_assign(&mut self, rhs: f32) {
1006 self.x.div_assign(rhs);
1007 self.y.div_assign(rhs);
1008 self.z.div_assign(rhs);
1009 }
1010}
1011
1012impl Div<Vec3> for f32 {
1013 type Output = Vec3;
1014 #[inline]
1015 fn div(self, rhs: Vec3) -> Vec3 {
1016 Vec3 {
1017 x: self.div(rhs.x),
1018 y: self.div(rhs.y),
1019 z: self.div(rhs.z),
1020 }
1021 }
1022}
1023
1024impl Mul<Vec3> for Vec3 {
1025 type Output = Self;
1026 #[inline]
1027 fn mul(self, rhs: Self) -> Self {
1028 Self {
1029 x: self.x.mul(rhs.x),
1030 y: self.y.mul(rhs.y),
1031 z: self.z.mul(rhs.z),
1032 }
1033 }
1034}
1035
1036impl MulAssign<Vec3> for Vec3 {
1037 #[inline]
1038 fn mul_assign(&mut self, rhs: Self) {
1039 self.x.mul_assign(rhs.x);
1040 self.y.mul_assign(rhs.y);
1041 self.z.mul_assign(rhs.z);
1042 }
1043}
1044
1045impl Mul<f32> for Vec3 {
1046 type Output = Self;
1047 #[inline]
1048 fn mul(self, rhs: f32) -> Self {
1049 Self {
1050 x: self.x.mul(rhs),
1051 y: self.y.mul(rhs),
1052 z: self.z.mul(rhs),
1053 }
1054 }
1055}
1056
1057impl MulAssign<f32> for Vec3 {
1058 #[inline]
1059 fn mul_assign(&mut self, rhs: f32) {
1060 self.x.mul_assign(rhs);
1061 self.y.mul_assign(rhs);
1062 self.z.mul_assign(rhs);
1063 }
1064}
1065
1066impl Mul<Vec3> for f32 {
1067 type Output = Vec3;
1068 #[inline]
1069 fn mul(self, rhs: Vec3) -> Vec3 {
1070 Vec3 {
1071 x: self.mul(rhs.x),
1072 y: self.mul(rhs.y),
1073 z: self.mul(rhs.z),
1074 }
1075 }
1076}
1077
1078impl Add<Vec3> for Vec3 {
1079 type Output = Self;
1080 #[inline]
1081 fn add(self, rhs: Self) -> Self {
1082 Self {
1083 x: self.x.add(rhs.x),
1084 y: self.y.add(rhs.y),
1085 z: self.z.add(rhs.z),
1086 }
1087 }
1088}
1089
1090impl AddAssign<Vec3> for Vec3 {
1091 #[inline]
1092 fn add_assign(&mut self, rhs: Self) {
1093 self.x.add_assign(rhs.x);
1094 self.y.add_assign(rhs.y);
1095 self.z.add_assign(rhs.z);
1096 }
1097}
1098
1099impl Add<f32> for Vec3 {
1100 type Output = Self;
1101 #[inline]
1102 fn add(self, rhs: f32) -> Self {
1103 Self {
1104 x: self.x.add(rhs),
1105 y: self.y.add(rhs),
1106 z: self.z.add(rhs),
1107 }
1108 }
1109}
1110
1111impl AddAssign<f32> for Vec3 {
1112 #[inline]
1113 fn add_assign(&mut self, rhs: f32) {
1114 self.x.add_assign(rhs);
1115 self.y.add_assign(rhs);
1116 self.z.add_assign(rhs);
1117 }
1118}
1119
1120impl Add<Vec3> for f32 {
1121 type Output = Vec3;
1122 #[inline]
1123 fn add(self, rhs: Vec3) -> Vec3 {
1124 Vec3 {
1125 x: self.add(rhs.x),
1126 y: self.add(rhs.y),
1127 z: self.add(rhs.z),
1128 }
1129 }
1130}
1131
1132impl Sub<Vec3> for Vec3 {
1133 type Output = Self;
1134 #[inline]
1135 fn sub(self, rhs: Self) -> Self {
1136 Self {
1137 x: self.x.sub(rhs.x),
1138 y: self.y.sub(rhs.y),
1139 z: self.z.sub(rhs.z),
1140 }
1141 }
1142}
1143
1144impl SubAssign<Vec3> for Vec3 {
1145 #[inline]
1146 fn sub_assign(&mut self, rhs: Vec3) {
1147 self.x.sub_assign(rhs.x);
1148 self.y.sub_assign(rhs.y);
1149 self.z.sub_assign(rhs.z);
1150 }
1151}
1152
1153impl Sub<f32> for Vec3 {
1154 type Output = Self;
1155 #[inline]
1156 fn sub(self, rhs: f32) -> Self {
1157 Self {
1158 x: self.x.sub(rhs),
1159 y: self.y.sub(rhs),
1160 z: self.z.sub(rhs),
1161 }
1162 }
1163}
1164
1165impl SubAssign<f32> for Vec3 {
1166 #[inline]
1167 fn sub_assign(&mut self, rhs: f32) {
1168 self.x.sub_assign(rhs);
1169 self.y.sub_assign(rhs);
1170 self.z.sub_assign(rhs);
1171 }
1172}
1173
1174impl Sub<Vec3> for f32 {
1175 type Output = Vec3;
1176 #[inline]
1177 fn sub(self, rhs: Vec3) -> Vec3 {
1178 Vec3 {
1179 x: self.sub(rhs.x),
1180 y: self.sub(rhs.y),
1181 z: self.sub(rhs.z),
1182 }
1183 }
1184}
1185
1186impl Rem<Vec3> for Vec3 {
1187 type Output = Self;
1188 #[inline]
1189 fn rem(self, rhs: Self) -> Self {
1190 Self {
1191 x: self.x.rem(rhs.x),
1192 y: self.y.rem(rhs.y),
1193 z: self.z.rem(rhs.z),
1194 }
1195 }
1196}
1197
1198impl RemAssign<Vec3> for Vec3 {
1199 #[inline]
1200 fn rem_assign(&mut self, rhs: Self) {
1201 self.x.rem_assign(rhs.x);
1202 self.y.rem_assign(rhs.y);
1203 self.z.rem_assign(rhs.z);
1204 }
1205}
1206
1207impl Rem<f32> for Vec3 {
1208 type Output = Self;
1209 #[inline]
1210 fn rem(self, rhs: f32) -> Self {
1211 Self {
1212 x: self.x.rem(rhs),
1213 y: self.y.rem(rhs),
1214 z: self.z.rem(rhs),
1215 }
1216 }
1217}
1218
1219impl RemAssign<f32> for Vec3 {
1220 #[inline]
1221 fn rem_assign(&mut self, rhs: f32) {
1222 self.x.rem_assign(rhs);
1223 self.y.rem_assign(rhs);
1224 self.z.rem_assign(rhs);
1225 }
1226}
1227
1228impl Rem<Vec3> for f32 {
1229 type Output = Vec3;
1230 #[inline]
1231 fn rem(self, rhs: Vec3) -> Vec3 {
1232 Vec3 {
1233 x: self.rem(rhs.x),
1234 y: self.rem(rhs.y),
1235 z: self.rem(rhs.z),
1236 }
1237 }
1238}
1239
1240#[cfg(not(target_arch = "spirv"))]
1241impl AsRef<[f32; 3]> for Vec3 {
1242 #[inline]
1243 fn as_ref(&self) -> &[f32; 3] {
1244 unsafe { &*(self as *const Vec3 as *const [f32; 3]) }
1245 }
1246}
1247
1248#[cfg(not(target_arch = "spirv"))]
1249impl AsMut<[f32; 3]> for Vec3 {
1250 #[inline]
1251 fn as_mut(&mut self) -> &mut [f32; 3] {
1252 unsafe { &mut *(self as *mut Vec3 as *mut [f32; 3]) }
1253 }
1254}
1255
1256impl Sum for Vec3 {
1257 #[inline]
1258 fn sum<I>(iter: I) -> Self
1259 where
1260 I: Iterator<Item = Self>,
1261 {
1262 iter.fold(Self::ZERO, Self::add)
1263 }
1264}
1265
1266impl<'a> Sum<&'a Self> for Vec3 {
1267 #[inline]
1268 fn sum<I>(iter: I) -> Self
1269 where
1270 I: Iterator<Item = &'a Self>,
1271 {
1272 iter.fold(Self::ZERO, |a, &b| Self::add(a, b))
1273 }
1274}
1275
1276impl Product for Vec3 {
1277 #[inline]
1278 fn product<I>(iter: I) -> Self
1279 where
1280 I: Iterator<Item = Self>,
1281 {
1282 iter.fold(Self::ONE, Self::mul)
1283 }
1284}
1285
1286impl<'a> Product<&'a Self> for Vec3 {
1287 #[inline]
1288 fn product<I>(iter: I) -> Self
1289 where
1290 I: Iterator<Item = &'a Self>,
1291 {
1292 iter.fold(Self::ONE, |a, &b| Self::mul(a, b))
1293 }
1294}
1295
1296impl Neg for Vec3 {
1297 type Output = Self;
1298 #[inline]
1299 fn neg(self) -> Self {
1300 Self {
1301 x: self.x.neg(),
1302 y: self.y.neg(),
1303 z: self.z.neg(),
1304 }
1305 }
1306}
1307
1308impl Index<usize> for Vec3 {
1309 type Output = f32;
1310 #[inline]
1311 fn index(&self, index: usize) -> &Self::Output {
1312 match index {
1313 0 => &self.x,
1314 1 => &self.y,
1315 2 => &self.z,
1316 _ => panic!("index out of bounds"),
1317 }
1318 }
1319}
1320
1321impl IndexMut<usize> for Vec3 {
1322 #[inline]
1323 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
1324 match index {
1325 0 => &mut self.x,
1326 1 => &mut self.y,
1327 2 => &mut self.z,
1328 _ => panic!("index out of bounds"),
1329 }
1330 }
1331}
1332
1333#[cfg(not(target_arch = "spirv"))]
1334impl fmt::Display for Vec3 {
1335 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1336 if let Some(p) = f.precision() {
1337 write!(f, "[{:.*}, {:.*}, {:.*}]", p, self.x, p, self.y, p, self.z)
1338 } else {
1339 write!(f, "[{}, {}, {}]", self.x, self.y, self.z)
1340 }
1341 }
1342}
1343
1344#[cfg(not(target_arch = "spirv"))]
1345impl fmt::Debug for Vec3 {
1346 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1347 fmt.debug_tuple(stringify!(Vec3))
1348 .field(&self.x)
1349 .field(&self.y)
1350 .field(&self.z)
1351 .finish()
1352 }
1353}
1354
1355impl From<[f32; 3]> for Vec3 {
1356 #[inline]
1357 fn from(a: [f32; 3]) -> Self {
1358 Self::new(a[0], a[1], a[2])
1359 }
1360}
1361
1362impl From<Vec3> for [f32; 3] {
1363 #[inline]
1364 fn from(v: Vec3) -> Self {
1365 [v.x, v.y, v.z]
1366 }
1367}
1368
1369impl From<(f32, f32, f32)> for Vec3 {
1370 #[inline]
1371 fn from(t: (f32, f32, f32)) -> Self {
1372 Self::new(t.0, t.1, t.2)
1373 }
1374}
1375
1376impl From<Vec3> for (f32, f32, f32) {
1377 #[inline]
1378 fn from(v: Vec3) -> Self {
1379 (v.x, v.y, v.z)
1380 }
1381}
1382
1383impl From<(Vec2, f32)> for Vec3 {
1384 #[inline]
1385 fn from((v, z): (Vec2, f32)) -> Self {
1386 Self::new(v.x, v.y, z)
1387 }
1388}
1389
1390impl From<BVec3> for Vec3 {
1391 #[inline]
1392 fn from(v: BVec3) -> Self {
1393 Self::new(f32::from(v.x), f32::from(v.y), f32::from(v.z))
1394 }
1395}
1396
1397impl From<BVec3A> for Vec3 {
1398 #[inline]
1399 fn from(v: BVec3A) -> Self {
1400 let bool_array: [bool; 3] = v.into();
1401 Self::new(
1402 f32::from(bool_array[0]),
1403 f32::from(bool_array[1]),
1404 f32::from(bool_array[2]),
1405 )
1406 }
1407}