1use crate::{f32::math, BVec3, BVec3A, FloatExt, Quat, Vec2, Vec3A, Vec4};
4
5use core::fmt;
6use core::iter::{Product, Sum};
7use core::{f32, ops::*};
8
9#[cfg(feature = "zerocopy")]
10use zerocopy_derive::*;
11
12#[inline(always)]
14#[must_use]
15pub const fn vec3(x: f32, y: f32, z: f32) -> Vec3 {
16 Vec3::new(x, y, z)
17}
18
19#[derive(Clone, Copy, PartialEq)]
21#[cfg_attr(feature = "bytemuck", derive(bytemuck::Pod, bytemuck::Zeroable))]
22#[cfg_attr(
23 feature = "zerocopy",
24 derive(FromBytes, Immutable, IntoBytes, KnownLayout)
25)]
26#[repr(C)]
27#[cfg_attr(target_arch = "spirv", rust_gpu::vector::v1)]
28pub struct Vec3 {
29 pub x: f32,
30 pub y: f32,
31 pub z: f32,
32}
33
34impl Vec3 {
35 pub const ZERO: Self = Self::splat(0.0);
37
38 pub const ONE: Self = Self::splat(1.0);
40
41 pub const NEG_ONE: Self = Self::splat(-1.0);
43
44 pub const MIN: Self = Self::splat(f32::MIN);
46
47 pub const MAX: Self = Self::splat(f32::MAX);
49
50 pub const NAN: Self = Self::splat(f32::NAN);
52
53 pub const INFINITY: Self = Self::splat(f32::INFINITY);
55
56 pub const NEG_INFINITY: Self = Self::splat(f32::NEG_INFINITY);
58
59 pub const X: Self = Self::new(1.0, 0.0, 0.0);
61
62 pub const Y: Self = Self::new(0.0, 1.0, 0.0);
64
65 pub const Z: Self = Self::new(0.0, 0.0, 1.0);
67
68 pub const NEG_X: Self = Self::new(-1.0, 0.0, 0.0);
70
71 pub const NEG_Y: Self = Self::new(0.0, -1.0, 0.0);
73
74 pub const NEG_Z: Self = Self::new(0.0, 0.0, -1.0);
76
77 pub const AXES: [Self; 3] = [Self::X, Self::Y, Self::Z];
79
80 pub const USES_CORE_SIMD: bool = false;
82 pub const USES_NEON: bool = false;
84 pub const USES_SCALAR_MATH: bool = true;
86 pub const USES_SSE2: bool = false;
88 pub const USES_WASM32_SIMD: bool = false;
90
91 #[inline(always)]
93 #[must_use]
94 pub const fn new(x: f32, y: f32, z: f32) -> Self {
95 Self { x, y, z }
96 }
97
98 #[inline]
100 #[must_use]
101 pub const fn splat(v: f32) -> Self {
102 Self { x: v, y: v, z: v }
103 }
104
105 #[inline]
107 #[must_use]
108 pub fn map<F>(self, f: F) -> Self
109 where
110 F: Fn(f32) -> f32,
111 {
112 Self::new(f(self.x), f(self.y), f(self.z))
113 }
114
115 #[inline]
121 #[must_use]
122 pub fn select(mask: BVec3, if_true: Self, if_false: Self) -> Self {
123 Self {
124 x: if mask.test(0) { if_true.x } else { if_false.x },
125 y: if mask.test(1) { if_true.y } else { if_false.y },
126 z: if mask.test(2) { if_true.z } else { if_false.z },
127 }
128 }
129
130 #[inline]
132 #[must_use]
133 pub const fn from_array(a: [f32; 3]) -> Self {
134 Self::new(a[0], a[1], a[2])
135 }
136
137 #[inline]
139 #[must_use]
140 pub const fn to_array(&self) -> [f32; 3] {
141 [self.x, self.y, self.z]
142 }
143
144 #[inline]
150 #[must_use]
151 pub const fn from_slice(slice: &[f32]) -> Self {
152 assert!(slice.len() >= 3);
153 Self::new(slice[0], slice[1], slice[2])
154 }
155
156 #[inline]
162 pub fn write_to_slice(self, slice: &mut [f32]) {
163 slice[..3].copy_from_slice(&self.to_array());
164 }
165
166 #[allow(dead_code)]
168 #[inline]
169 #[must_use]
170 pub(crate) fn from_vec4(v: Vec4) -> Self {
171 Self {
172 x: v.x,
173 y: v.y,
174 z: v.z,
175 }
176 }
177
178 #[inline]
180 #[must_use]
181 pub fn extend(self, w: f32) -> Vec4 {
182 Vec4::new(self.x, self.y, self.z, w)
183 }
184
185 #[inline]
189 #[must_use]
190 pub fn truncate(self) -> Vec2 {
191 use crate::swizzles::Vec3Swizzles;
192 self.xy()
193 }
194
195 #[inline]
201 #[must_use]
202 pub fn from_homogeneous(v: Vec4) -> Self {
203 glam_assert!(v.w != 0.0);
204 Self::from_vec4(v) / v.w
205 }
206
207 #[inline]
209 #[must_use]
210 pub fn to_homogeneous(self) -> Vec4 {
211 self.extend(1.0)
212 }
213
214 #[inline]
216 #[must_use]
217 pub fn to_vec3a(self) -> Vec3A {
218 Vec3A::from(self)
219 }
220
221 #[inline]
223 #[must_use]
224 pub fn with_x(mut self, x: f32) -> Self {
225 self.x = x;
226 self
227 }
228
229 #[inline]
231 #[must_use]
232 pub fn with_y(mut self, y: f32) -> Self {
233 self.y = y;
234 self
235 }
236
237 #[inline]
239 #[must_use]
240 pub fn with_z(mut self, z: f32) -> Self {
241 self.z = z;
242 self
243 }
244
245 #[inline]
247 #[must_use]
248 pub fn dot(self, rhs: Self) -> f32 {
249 (self.x * rhs.x) + (self.y * rhs.y) + (self.z * rhs.z)
250 }
251
252 #[inline]
254 #[must_use]
255 pub fn dot_into_vec(self, rhs: Self) -> Self {
256 Self::splat(self.dot(rhs))
257 }
258
259 #[inline]
261 #[must_use]
262 pub fn cross(self, rhs: Self) -> Self {
263 Self {
264 x: self.y * rhs.z - rhs.y * self.z,
265 y: self.z * rhs.x - rhs.z * self.x,
266 z: self.x * rhs.y - rhs.x * self.y,
267 }
268 }
269
270 #[inline]
277 #[must_use]
278 pub fn min(self, rhs: Self) -> Self {
279 Self {
280 x: if self.x < rhs.x { self.x } else { rhs.x },
281 y: if self.y < rhs.y { self.y } else { rhs.y },
282 z: if self.z < rhs.z { self.z } else { rhs.z },
283 }
284 }
285
286 #[inline]
293 #[must_use]
294 pub fn max(self, rhs: Self) -> Self {
295 Self {
296 x: if self.x > rhs.x { self.x } else { rhs.x },
297 y: if self.y > rhs.y { self.y } else { rhs.y },
298 z: if self.z > rhs.z { self.z } else { rhs.z },
299 }
300 }
301
302 #[inline]
313 #[must_use]
314 pub fn clamp(self, min: Self, max: Self) -> Self {
315 glam_assert!(min.cmple(max).all(), "clamp: expected min <= max");
316 self.max(min).min(max)
317 }
318
319 #[inline]
326 #[must_use]
327 pub fn min_element(self) -> f32 {
328 let min = |a, b| if a < b { a } else { b };
329 min(self.x, min(self.y, self.z))
330 }
331
332 #[inline]
339 #[must_use]
340 pub fn max_element(self) -> f32 {
341 let max = |a, b| if a > b { a } else { b };
342 max(self.x, max(self.y, self.z))
343 }
344
345 #[doc(alias = "argmin")]
347 #[inline]
348 #[must_use]
349 pub fn min_position(self) -> usize {
350 let mut min = self.x;
351 let mut index = 0;
352 if self.y < min {
353 min = self.y;
354 index = 1;
355 }
356 if self.z < min {
357 index = 2;
358 }
359 index
360 }
361
362 #[doc(alias = "argmax")]
364 #[inline]
365 #[must_use]
366 pub fn max_position(self) -> usize {
367 let mut max = self.x;
368 let mut index = 0;
369 if self.y > max {
370 max = self.y;
371 index = 1;
372 }
373 if self.z > max {
374 index = 2;
375 }
376 index
377 }
378
379 #[inline]
383 #[must_use]
384 pub fn element_sum(self) -> f32 {
385 self.x + self.y + self.z
386 }
387
388 #[inline]
392 #[must_use]
393 pub fn element_product(self) -> f32 {
394 self.x * self.y * self.z
395 }
396
397 #[inline]
403 #[must_use]
404 pub fn cmpeq(self, rhs: Self) -> BVec3 {
405 BVec3::new(self.x.eq(&rhs.x), self.y.eq(&rhs.y), self.z.eq(&rhs.z))
406 }
407
408 #[inline]
414 #[must_use]
415 pub fn cmpne(self, rhs: Self) -> BVec3 {
416 BVec3::new(self.x.ne(&rhs.x), self.y.ne(&rhs.y), self.z.ne(&rhs.z))
417 }
418
419 #[inline]
425 #[must_use]
426 pub fn cmpge(self, rhs: Self) -> BVec3 {
427 BVec3::new(self.x.ge(&rhs.x), self.y.ge(&rhs.y), self.z.ge(&rhs.z))
428 }
429
430 #[inline]
436 #[must_use]
437 pub fn cmpgt(self, rhs: Self) -> BVec3 {
438 BVec3::new(self.x.gt(&rhs.x), self.y.gt(&rhs.y), self.z.gt(&rhs.z))
439 }
440
441 #[inline]
447 #[must_use]
448 pub fn cmple(self, rhs: Self) -> BVec3 {
449 BVec3::new(self.x.le(&rhs.x), self.y.le(&rhs.y), self.z.le(&rhs.z))
450 }
451
452 #[inline]
458 #[must_use]
459 pub fn cmplt(self, rhs: Self) -> BVec3 {
460 BVec3::new(self.x.lt(&rhs.x), self.y.lt(&rhs.y), self.z.lt(&rhs.z))
461 }
462
463 #[inline]
465 #[must_use]
466 pub fn abs(self) -> Self {
467 Self {
468 x: math::abs(self.x),
469 y: math::abs(self.y),
470 z: math::abs(self.z),
471 }
472 }
473
474 #[inline]
480 #[must_use]
481 pub fn signum(self) -> Self {
482 Self {
483 x: math::signum(self.x),
484 y: math::signum(self.y),
485 z: math::signum(self.z),
486 }
487 }
488
489 #[inline]
491 #[must_use]
492 pub fn copysign(self, rhs: Self) -> Self {
493 Self {
494 x: math::copysign(self.x, rhs.x),
495 y: math::copysign(self.y, rhs.y),
496 z: math::copysign(self.z, rhs.z),
497 }
498 }
499
500 #[inline]
508 #[must_use]
509 pub fn is_negative_bitmask(self) -> u32 {
510 (self.x.is_sign_negative() as u32)
511 | ((self.y.is_sign_negative() as u32) << 1)
512 | ((self.z.is_sign_negative() as u32) << 2)
513 }
514
515 #[inline]
518 #[must_use]
519 pub fn is_finite(self) -> bool {
520 self.x.is_finite() && self.y.is_finite() && self.z.is_finite()
521 }
522
523 #[inline]
527 #[must_use]
528 pub fn is_finite_mask(self) -> BVec3 {
529 BVec3::new(self.x.is_finite(), self.y.is_finite(), self.z.is_finite())
530 }
531
532 #[inline]
534 #[must_use]
535 pub fn is_nan(self) -> bool {
536 self.x.is_nan() || self.y.is_nan() || self.z.is_nan()
537 }
538
539 #[inline]
543 #[must_use]
544 pub fn is_nan_mask(self) -> BVec3 {
545 BVec3::new(self.x.is_nan(), self.y.is_nan(), self.z.is_nan())
546 }
547
548 #[doc(alias = "magnitude")]
550 #[inline]
551 #[must_use]
552 pub fn length(self) -> f32 {
553 math::sqrt(self.dot(self))
554 }
555
556 #[doc(alias = "magnitude2")]
560 #[inline]
561 #[must_use]
562 pub fn length_squared(self) -> f32 {
563 self.dot(self)
564 }
565
566 #[inline]
570 #[must_use]
571 pub fn length_recip(self) -> f32 {
572 self.length().recip()
573 }
574
575 #[inline]
577 #[must_use]
578 pub fn distance(self, rhs: Self) -> f32 {
579 (self - rhs).length()
580 }
581
582 #[inline]
584 #[must_use]
585 pub fn distance_squared(self, rhs: Self) -> f32 {
586 (self - rhs).length_squared()
587 }
588
589 #[inline]
591 #[must_use]
592 pub fn div_euclid(self, rhs: Self) -> Self {
593 Self::new(
594 math::div_euclid(self.x, rhs.x),
595 math::div_euclid(self.y, rhs.y),
596 math::div_euclid(self.z, rhs.z),
597 )
598 }
599
600 #[inline]
604 #[must_use]
605 pub fn rem_euclid(self, rhs: Self) -> Self {
606 Self::new(
607 math::rem_euclid(self.x, rhs.x),
608 math::rem_euclid(self.y, rhs.y),
609 math::rem_euclid(self.z, rhs.z),
610 )
611 }
612
613 #[inline]
623 #[must_use]
624 pub fn normalize(self) -> Self {
625 #[allow(clippy::let_and_return)]
626 let normalized = self.mul(self.length_recip());
627 glam_assert!(normalized.is_finite());
628 normalized
629 }
630
631 #[inline]
638 #[must_use]
639 pub fn try_normalize(self) -> Option<Self> {
640 let rcp = self.length_recip();
641 if rcp.is_finite() && rcp > 0.0 {
642 Some(self * rcp)
643 } else {
644 None
645 }
646 }
647
648 #[inline]
656 #[must_use]
657 pub fn normalize_or(self, fallback: Self) -> Self {
658 let rcp = self.length_recip();
659 if rcp.is_finite() && rcp > 0.0 {
660 self * rcp
661 } else {
662 fallback
663 }
664 }
665
666 #[inline]
673 #[must_use]
674 pub fn normalize_or_zero(self) -> Self {
675 self.normalize_or(Self::ZERO)
676 }
677
678 #[inline]
682 #[must_use]
683 pub fn normalize_and_length(self) -> (Self, f32) {
684 let length = self.length();
685 let rcp = 1.0 / length;
686 if rcp.is_finite() && rcp > 0.0 {
687 (self * rcp, length)
688 } else {
689 (Self::X, 0.0)
690 }
691 }
692
693 #[inline]
697 #[must_use]
698 pub fn is_normalized(self) -> bool {
699 math::abs(self.length_squared() - 1.0) <= 2e-4
700 }
701
702 #[inline]
710 #[must_use]
711 pub fn project_onto(self, rhs: Self) -> Self {
712 let other_len_sq_rcp = rhs.dot(rhs).recip();
713 glam_assert!(other_len_sq_rcp.is_finite());
714 rhs * self.dot(rhs) * other_len_sq_rcp
715 }
716
717 #[doc(alias("plane"))]
728 #[inline]
729 #[must_use]
730 pub fn reject_from(self, rhs: Self) -> Self {
731 self - self.project_onto(rhs)
732 }
733
734 #[inline]
742 #[must_use]
743 pub fn project_onto_normalized(self, rhs: Self) -> Self {
744 glam_assert!(rhs.is_normalized());
745 rhs * self.dot(rhs)
746 }
747
748 #[doc(alias("plane"))]
759 #[inline]
760 #[must_use]
761 pub fn reject_from_normalized(self, rhs: Self) -> Self {
762 self - self.project_onto_normalized(rhs)
763 }
764
765 #[inline]
768 #[must_use]
769 pub fn round(self) -> Self {
770 Self {
771 x: math::round(self.x),
772 y: math::round(self.y),
773 z: math::round(self.z),
774 }
775 }
776
777 #[inline]
780 #[must_use]
781 pub fn floor(self) -> Self {
782 Self {
783 x: math::floor(self.x),
784 y: math::floor(self.y),
785 z: math::floor(self.z),
786 }
787 }
788
789 #[inline]
792 #[must_use]
793 pub fn ceil(self) -> Self {
794 Self {
795 x: math::ceil(self.x),
796 y: math::ceil(self.y),
797 z: math::ceil(self.z),
798 }
799 }
800
801 #[inline]
804 #[must_use]
805 pub fn trunc(self) -> Self {
806 Self {
807 x: math::trunc(self.x),
808 y: math::trunc(self.y),
809 z: math::trunc(self.z),
810 }
811 }
812
813 #[inline]
820 #[must_use]
821 pub fn fract(self) -> Self {
822 self - self.trunc()
823 }
824
825 #[inline]
832 #[must_use]
833 pub fn fract_gl(self) -> Self {
834 self - self.floor()
835 }
836
837 #[inline]
840 #[must_use]
841 pub fn exp(self) -> Self {
842 Self::new(math::exp(self.x), math::exp(self.y), math::exp(self.z))
843 }
844
845 #[inline]
847 #[must_use]
848 pub fn exp2(self) -> Self {
849 Self::new(math::exp2(self.x), math::exp2(self.y), math::exp2(self.z))
850 }
851
852 #[inline]
855 #[must_use]
856 pub fn ln(self) -> Self {
857 Self::new(math::ln(self.x), math::ln(self.y), math::ln(self.z))
858 }
859
860 #[inline]
863 #[must_use]
864 pub fn log2(self) -> Self {
865 Self::new(math::log2(self.x), math::log2(self.y), math::log2(self.z))
866 }
867
868 #[inline]
870 #[must_use]
871 pub fn powf(self, n: f32) -> Self {
872 Self::new(
873 math::powf(self.x, n),
874 math::powf(self.y, n),
875 math::powf(self.z, n),
876 )
877 }
878
879 #[inline]
881 #[must_use]
882 pub fn recip(self) -> Self {
883 Self {
884 x: 1.0 / self.x,
885 y: 1.0 / self.y,
886 z: 1.0 / self.z,
887 }
888 }
889
890 #[doc(alias = "mix")]
896 #[inline]
897 #[must_use]
898 pub fn lerp(self, rhs: Self, s: f32) -> Self {
899 self * (1.0 - s) + rhs * s
900 }
901
902 #[inline]
907 #[must_use]
908 pub fn move_towards(&self, rhs: Self, d: f32) -> Self {
909 let a = rhs - *self;
910 let len = a.length();
911 if len <= d || len <= 1e-4 {
912 return rhs;
913 }
914 *self + a / len * d
915 }
916
917 #[inline]
923 pub fn midpoint(self, rhs: Self) -> Self {
924 (self + rhs) * 0.5
925 }
926
927 #[inline]
937 #[must_use]
938 pub fn abs_diff_eq(self, rhs: Self, max_abs_diff: f32) -> bool {
939 self.sub(rhs).abs().cmple(Self::splat(max_abs_diff)).all()
940 }
941
942 #[inline]
948 #[must_use]
949 pub fn clamp_length(self, min: f32, max: f32) -> Self {
950 glam_assert!(0.0 <= min);
951 glam_assert!(min <= max);
952 let length_sq = self.length_squared();
953 if length_sq < min * min {
954 min * (self / math::sqrt(length_sq))
955 } else if length_sq > max * max {
956 max * (self / math::sqrt(length_sq))
957 } else {
958 self
959 }
960 }
961
962 #[inline]
968 #[must_use]
969 pub fn clamp_length_max(self, max: f32) -> Self {
970 glam_assert!(0.0 <= max);
971 let length_sq = self.length_squared();
972 if length_sq > max * max {
973 max * (self / math::sqrt(length_sq))
974 } else {
975 self
976 }
977 }
978
979 #[inline]
985 #[must_use]
986 pub fn clamp_length_min(self, min: f32) -> Self {
987 glam_assert!(0.0 <= min);
988 let length_sq = self.length_squared();
989 if length_sq < min * min {
990 min * (self / math::sqrt(length_sq))
991 } else {
992 self
993 }
994 }
995
996 #[inline]
1004 #[must_use]
1005 pub fn mul_add(self, a: Self, b: Self) -> Self {
1006 Self::new(
1007 math::mul_add(self.x, a.x, b.x),
1008 math::mul_add(self.y, a.y, b.y),
1009 math::mul_add(self.z, a.z, b.z),
1010 )
1011 }
1012
1013 #[inline]
1022 #[must_use]
1023 pub fn reflect(self, normal: Self) -> Self {
1024 glam_assert!(normal.is_normalized());
1025 self - 2.0 * self.dot(normal) * normal
1026 }
1027
1028 #[inline]
1038 #[must_use]
1039 pub fn refract(self, normal: Self, eta: f32) -> Self {
1040 glam_assert!(self.is_normalized());
1041 glam_assert!(normal.is_normalized());
1042 let n_dot_i = normal.dot(self);
1043 let k = 1.0 - eta * eta * (1.0 - n_dot_i * n_dot_i);
1044 if k >= 0.0 {
1045 eta * self - (eta * n_dot_i + math::sqrt(k)) * normal
1046 } else {
1047 Self::ZERO
1048 }
1049 }
1050
1051 #[inline]
1055 #[must_use]
1056 pub fn angle_between(self, rhs: Self) -> f32 {
1057 math::acos_approx(
1058 self.dot(rhs)
1059 .div(math::sqrt(self.length_squared().mul(rhs.length_squared()))),
1060 )
1061 }
1062
1063 #[inline]
1065 #[must_use]
1066 pub fn rotate_x(self, angle: f32) -> Self {
1067 let (sina, cosa) = math::sin_cos(angle);
1068 Self::new(
1069 self.x,
1070 self.y * cosa - self.z * sina,
1071 self.y * sina + self.z * cosa,
1072 )
1073 }
1074
1075 #[inline]
1077 #[must_use]
1078 pub fn rotate_y(self, angle: f32) -> Self {
1079 let (sina, cosa) = math::sin_cos(angle);
1080 Self::new(
1081 self.x * cosa + self.z * sina,
1082 self.y,
1083 self.x * -sina + self.z * cosa,
1084 )
1085 }
1086
1087 #[inline]
1089 #[must_use]
1090 pub fn rotate_z(self, angle: f32) -> Self {
1091 let (sina, cosa) = math::sin_cos(angle);
1092 Self::new(
1093 self.x * cosa - self.y * sina,
1094 self.x * sina + self.y * cosa,
1095 self.z,
1096 )
1097 }
1098
1099 #[inline]
1107 #[must_use]
1108 pub fn rotate_axis(self, axis: Self, angle: f32) -> Self {
1109 Quat::from_axis_angle(axis, angle) * self
1110 }
1111
1112 #[inline]
1118 #[must_use]
1119 pub fn rotate_towards(self, rhs: Self, max_angle: f32) -> Self {
1120 let angle_between = self.angle_between(rhs);
1121 let angle = max_angle.clamp(angle_between - core::f32::consts::PI, angle_between);
1123 let axis = self
1124 .cross(rhs)
1125 .try_normalize()
1126 .unwrap_or_else(|| self.any_orthogonal_vector().normalize());
1127 Quat::from_axis_angle(axis, angle) * self
1128 }
1129
1130 #[inline]
1137 #[must_use]
1138 pub fn any_orthogonal_vector(&self) -> Self {
1139 if math::abs(self.x) > math::abs(self.y) {
1141 Self::new(-self.z, 0.0, self.x) } else {
1143 Self::new(0.0, self.z, -self.y) }
1145 }
1146
1147 #[inline]
1155 #[must_use]
1156 pub fn any_orthonormal_vector(&self) -> Self {
1157 glam_assert!(self.is_normalized());
1158 let sign = math::signum(self.z);
1160 let a = -1.0 / (sign + self.z);
1161 let b = self.x * self.y * a;
1162 Self::new(b, sign + self.y * self.y * a, -self.y)
1163 }
1164
1165 #[inline]
1172 #[must_use]
1173 pub fn any_orthonormal_pair(&self) -> (Self, Self) {
1174 glam_assert!(self.is_normalized());
1175 let sign = math::signum(self.z);
1177 let a = -1.0 / (sign + self.z);
1178 let b = self.x * self.y * a;
1179 (
1180 Self::new(1.0 + sign * self.x * self.x * a, sign * b, -sign * self.x),
1181 Self::new(b, sign + self.y * self.y * a, -self.y),
1182 )
1183 }
1184
1185 #[inline]
1191 #[must_use]
1192 pub fn slerp(self, rhs: Self, s: f32) -> Self {
1193 let self_length = self.length();
1194 let rhs_length = rhs.length();
1195 let dot = self.dot(rhs) / (self_length * rhs_length);
1197 if math::abs(dot) < 1.0 - 3e-7 {
1199 let theta = math::acos_approx(dot);
1201 let sin_theta = math::sin(theta);
1203 let t1 = math::sin(theta * (1. - s));
1204 let t2 = math::sin(theta * s);
1205
1206 let result_length = self_length.lerp(rhs_length, s);
1208 return (self * (result_length / self_length) * t1
1210 + rhs * (result_length / rhs_length) * t2)
1211 * sin_theta.recip();
1212 }
1213 if dot < 0.0 {
1214 let axis = self.any_orthogonal_vector().normalize();
1218 let rotation = Quat::from_axis_angle(axis, core::f32::consts::PI * s);
1219 let result_length = self_length.lerp(rhs_length, s);
1221 rotation * self * (result_length / self_length)
1222 } else {
1223 self.lerp(rhs, s)
1225 }
1226 }
1227
1228 #[inline]
1230 #[must_use]
1231 pub fn as_dvec3(&self) -> crate::DVec3 {
1232 crate::DVec3::new(self.x as f64, self.y as f64, self.z as f64)
1233 }
1234
1235 #[inline]
1237 #[must_use]
1238 pub fn as_i8vec3(&self) -> crate::I8Vec3 {
1239 crate::I8Vec3::new(self.x as i8, self.y as i8, self.z as i8)
1240 }
1241
1242 #[inline]
1244 #[must_use]
1245 pub fn as_u8vec3(&self) -> crate::U8Vec3 {
1246 crate::U8Vec3::new(self.x as u8, self.y as u8, self.z as u8)
1247 }
1248
1249 #[inline]
1251 #[must_use]
1252 pub fn as_i16vec3(&self) -> crate::I16Vec3 {
1253 crate::I16Vec3::new(self.x as i16, self.y as i16, self.z as i16)
1254 }
1255
1256 #[inline]
1258 #[must_use]
1259 pub fn as_u16vec3(&self) -> crate::U16Vec3 {
1260 crate::U16Vec3::new(self.x as u16, self.y as u16, self.z as u16)
1261 }
1262
1263 #[inline]
1265 #[must_use]
1266 pub fn as_ivec3(&self) -> crate::IVec3 {
1267 crate::IVec3::new(self.x as i32, self.y as i32, self.z as i32)
1268 }
1269
1270 #[inline]
1272 #[must_use]
1273 pub fn as_uvec3(&self) -> crate::UVec3 {
1274 crate::UVec3::new(self.x as u32, self.y as u32, self.z as u32)
1275 }
1276
1277 #[inline]
1279 #[must_use]
1280 pub fn as_i64vec3(&self) -> crate::I64Vec3 {
1281 crate::I64Vec3::new(self.x as i64, self.y as i64, self.z as i64)
1282 }
1283
1284 #[inline]
1286 #[must_use]
1287 pub fn as_u64vec3(&self) -> crate::U64Vec3 {
1288 crate::U64Vec3::new(self.x as u64, self.y as u64, self.z as u64)
1289 }
1290
1291 #[inline]
1293 #[must_use]
1294 pub fn as_usizevec3(&self) -> crate::USizeVec3 {
1295 crate::USizeVec3::new(self.x as usize, self.y as usize, self.z as usize)
1296 }
1297}
1298
1299impl Default for Vec3 {
1300 #[inline(always)]
1301 fn default() -> Self {
1302 Self::ZERO
1303 }
1304}
1305
1306impl Div for Vec3 {
1307 type Output = Self;
1308 #[inline]
1309 fn div(self, rhs: Self) -> Self {
1310 Self {
1311 x: self.x.div(rhs.x),
1312 y: self.y.div(rhs.y),
1313 z: self.z.div(rhs.z),
1314 }
1315 }
1316}
1317
1318impl Div<&Self> for Vec3 {
1319 type Output = Self;
1320 #[inline]
1321 fn div(self, rhs: &Self) -> Self {
1322 self.div(*rhs)
1323 }
1324}
1325
1326impl Div<&Vec3> for &Vec3 {
1327 type Output = Vec3;
1328 #[inline]
1329 fn div(self, rhs: &Vec3) -> Vec3 {
1330 (*self).div(*rhs)
1331 }
1332}
1333
1334impl Div<Vec3> for &Vec3 {
1335 type Output = Vec3;
1336 #[inline]
1337 fn div(self, rhs: Vec3) -> Vec3 {
1338 (*self).div(rhs)
1339 }
1340}
1341
1342impl DivAssign for Vec3 {
1343 #[inline]
1344 fn div_assign(&mut self, rhs: Self) {
1345 self.x.div_assign(rhs.x);
1346 self.y.div_assign(rhs.y);
1347 self.z.div_assign(rhs.z);
1348 }
1349}
1350
1351impl DivAssign<&Self> for Vec3 {
1352 #[inline]
1353 fn div_assign(&mut self, rhs: &Self) {
1354 self.div_assign(*rhs);
1355 }
1356}
1357
1358impl Div<f32> for Vec3 {
1359 type Output = Self;
1360 #[inline]
1361 fn div(self, rhs: f32) -> Self {
1362 Self {
1363 x: self.x.div(rhs),
1364 y: self.y.div(rhs),
1365 z: self.z.div(rhs),
1366 }
1367 }
1368}
1369
1370impl Div<&f32> for Vec3 {
1371 type Output = Self;
1372 #[inline]
1373 fn div(self, rhs: &f32) -> Self {
1374 self.div(*rhs)
1375 }
1376}
1377
1378impl Div<&f32> for &Vec3 {
1379 type Output = Vec3;
1380 #[inline]
1381 fn div(self, rhs: &f32) -> Vec3 {
1382 (*self).div(*rhs)
1383 }
1384}
1385
1386impl Div<f32> for &Vec3 {
1387 type Output = Vec3;
1388 #[inline]
1389 fn div(self, rhs: f32) -> Vec3 {
1390 (*self).div(rhs)
1391 }
1392}
1393
1394impl DivAssign<f32> for Vec3 {
1395 #[inline]
1396 fn div_assign(&mut self, rhs: f32) {
1397 self.x.div_assign(rhs);
1398 self.y.div_assign(rhs);
1399 self.z.div_assign(rhs);
1400 }
1401}
1402
1403impl DivAssign<&f32> for Vec3 {
1404 #[inline]
1405 fn div_assign(&mut self, rhs: &f32) {
1406 self.div_assign(*rhs);
1407 }
1408}
1409
1410impl Div<Vec3> for f32 {
1411 type Output = Vec3;
1412 #[inline]
1413 fn div(self, rhs: Vec3) -> Vec3 {
1414 Vec3 {
1415 x: self.div(rhs.x),
1416 y: self.div(rhs.y),
1417 z: self.div(rhs.z),
1418 }
1419 }
1420}
1421
1422impl Div<&Vec3> for f32 {
1423 type Output = Vec3;
1424 #[inline]
1425 fn div(self, rhs: &Vec3) -> Vec3 {
1426 self.div(*rhs)
1427 }
1428}
1429
1430impl Div<&Vec3> for &f32 {
1431 type Output = Vec3;
1432 #[inline]
1433 fn div(self, rhs: &Vec3) -> Vec3 {
1434 (*self).div(*rhs)
1435 }
1436}
1437
1438impl Div<Vec3> for &f32 {
1439 type Output = Vec3;
1440 #[inline]
1441 fn div(self, rhs: Vec3) -> Vec3 {
1442 (*self).div(rhs)
1443 }
1444}
1445
1446impl Mul for Vec3 {
1447 type Output = Self;
1448 #[inline]
1449 fn mul(self, rhs: Self) -> Self {
1450 Self {
1451 x: self.x.mul(rhs.x),
1452 y: self.y.mul(rhs.y),
1453 z: self.z.mul(rhs.z),
1454 }
1455 }
1456}
1457
1458impl Mul<&Self> for Vec3 {
1459 type Output = Self;
1460 #[inline]
1461 fn mul(self, rhs: &Self) -> Self {
1462 self.mul(*rhs)
1463 }
1464}
1465
1466impl Mul<&Vec3> for &Vec3 {
1467 type Output = Vec3;
1468 #[inline]
1469 fn mul(self, rhs: &Vec3) -> Vec3 {
1470 (*self).mul(*rhs)
1471 }
1472}
1473
1474impl Mul<Vec3> for &Vec3 {
1475 type Output = Vec3;
1476 #[inline]
1477 fn mul(self, rhs: Vec3) -> Vec3 {
1478 (*self).mul(rhs)
1479 }
1480}
1481
1482impl MulAssign for Vec3 {
1483 #[inline]
1484 fn mul_assign(&mut self, rhs: Self) {
1485 self.x.mul_assign(rhs.x);
1486 self.y.mul_assign(rhs.y);
1487 self.z.mul_assign(rhs.z);
1488 }
1489}
1490
1491impl MulAssign<&Self> for Vec3 {
1492 #[inline]
1493 fn mul_assign(&mut self, rhs: &Self) {
1494 self.mul_assign(*rhs);
1495 }
1496}
1497
1498impl Mul<f32> for Vec3 {
1499 type Output = Self;
1500 #[inline]
1501 fn mul(self, rhs: f32) -> Self {
1502 Self {
1503 x: self.x.mul(rhs),
1504 y: self.y.mul(rhs),
1505 z: self.z.mul(rhs),
1506 }
1507 }
1508}
1509
1510impl Mul<&f32> for Vec3 {
1511 type Output = Self;
1512 #[inline]
1513 fn mul(self, rhs: &f32) -> Self {
1514 self.mul(*rhs)
1515 }
1516}
1517
1518impl Mul<&f32> for &Vec3 {
1519 type Output = Vec3;
1520 #[inline]
1521 fn mul(self, rhs: &f32) -> Vec3 {
1522 (*self).mul(*rhs)
1523 }
1524}
1525
1526impl Mul<f32> for &Vec3 {
1527 type Output = Vec3;
1528 #[inline]
1529 fn mul(self, rhs: f32) -> Vec3 {
1530 (*self).mul(rhs)
1531 }
1532}
1533
1534impl MulAssign<f32> for Vec3 {
1535 #[inline]
1536 fn mul_assign(&mut self, rhs: f32) {
1537 self.x.mul_assign(rhs);
1538 self.y.mul_assign(rhs);
1539 self.z.mul_assign(rhs);
1540 }
1541}
1542
1543impl MulAssign<&f32> for Vec3 {
1544 #[inline]
1545 fn mul_assign(&mut self, rhs: &f32) {
1546 self.mul_assign(*rhs);
1547 }
1548}
1549
1550impl Mul<Vec3> for f32 {
1551 type Output = Vec3;
1552 #[inline]
1553 fn mul(self, rhs: Vec3) -> Vec3 {
1554 Vec3 {
1555 x: self.mul(rhs.x),
1556 y: self.mul(rhs.y),
1557 z: self.mul(rhs.z),
1558 }
1559 }
1560}
1561
1562impl Mul<&Vec3> for f32 {
1563 type Output = Vec3;
1564 #[inline]
1565 fn mul(self, rhs: &Vec3) -> Vec3 {
1566 self.mul(*rhs)
1567 }
1568}
1569
1570impl Mul<&Vec3> for &f32 {
1571 type Output = Vec3;
1572 #[inline]
1573 fn mul(self, rhs: &Vec3) -> Vec3 {
1574 (*self).mul(*rhs)
1575 }
1576}
1577
1578impl Mul<Vec3> for &f32 {
1579 type Output = Vec3;
1580 #[inline]
1581 fn mul(self, rhs: Vec3) -> Vec3 {
1582 (*self).mul(rhs)
1583 }
1584}
1585
1586impl Add for Vec3 {
1587 type Output = Self;
1588 #[inline]
1589 fn add(self, rhs: Self) -> Self {
1590 Self {
1591 x: self.x.add(rhs.x),
1592 y: self.y.add(rhs.y),
1593 z: self.z.add(rhs.z),
1594 }
1595 }
1596}
1597
1598impl Add<&Self> for Vec3 {
1599 type Output = Self;
1600 #[inline]
1601 fn add(self, rhs: &Self) -> Self {
1602 self.add(*rhs)
1603 }
1604}
1605
1606impl Add<&Vec3> for &Vec3 {
1607 type Output = Vec3;
1608 #[inline]
1609 fn add(self, rhs: &Vec3) -> Vec3 {
1610 (*self).add(*rhs)
1611 }
1612}
1613
1614impl Add<Vec3> for &Vec3 {
1615 type Output = Vec3;
1616 #[inline]
1617 fn add(self, rhs: Vec3) -> Vec3 {
1618 (*self).add(rhs)
1619 }
1620}
1621
1622impl AddAssign for Vec3 {
1623 #[inline]
1624 fn add_assign(&mut self, rhs: Self) {
1625 self.x.add_assign(rhs.x);
1626 self.y.add_assign(rhs.y);
1627 self.z.add_assign(rhs.z);
1628 }
1629}
1630
1631impl AddAssign<&Self> for Vec3 {
1632 #[inline]
1633 fn add_assign(&mut self, rhs: &Self) {
1634 self.add_assign(*rhs);
1635 }
1636}
1637
1638impl Add<f32> for Vec3 {
1639 type Output = Self;
1640 #[inline]
1641 fn add(self, rhs: f32) -> Self {
1642 Self {
1643 x: self.x.add(rhs),
1644 y: self.y.add(rhs),
1645 z: self.z.add(rhs),
1646 }
1647 }
1648}
1649
1650impl Add<&f32> for Vec3 {
1651 type Output = Self;
1652 #[inline]
1653 fn add(self, rhs: &f32) -> Self {
1654 self.add(*rhs)
1655 }
1656}
1657
1658impl Add<&f32> for &Vec3 {
1659 type Output = Vec3;
1660 #[inline]
1661 fn add(self, rhs: &f32) -> Vec3 {
1662 (*self).add(*rhs)
1663 }
1664}
1665
1666impl Add<f32> for &Vec3 {
1667 type Output = Vec3;
1668 #[inline]
1669 fn add(self, rhs: f32) -> Vec3 {
1670 (*self).add(rhs)
1671 }
1672}
1673
1674impl AddAssign<f32> for Vec3 {
1675 #[inline]
1676 fn add_assign(&mut self, rhs: f32) {
1677 self.x.add_assign(rhs);
1678 self.y.add_assign(rhs);
1679 self.z.add_assign(rhs);
1680 }
1681}
1682
1683impl AddAssign<&f32> for Vec3 {
1684 #[inline]
1685 fn add_assign(&mut self, rhs: &f32) {
1686 self.add_assign(*rhs);
1687 }
1688}
1689
1690impl Add<Vec3> for f32 {
1691 type Output = Vec3;
1692 #[inline]
1693 fn add(self, rhs: Vec3) -> Vec3 {
1694 Vec3 {
1695 x: self.add(rhs.x),
1696 y: self.add(rhs.y),
1697 z: self.add(rhs.z),
1698 }
1699 }
1700}
1701
1702impl Add<&Vec3> for f32 {
1703 type Output = Vec3;
1704 #[inline]
1705 fn add(self, rhs: &Vec3) -> Vec3 {
1706 self.add(*rhs)
1707 }
1708}
1709
1710impl Add<&Vec3> for &f32 {
1711 type Output = Vec3;
1712 #[inline]
1713 fn add(self, rhs: &Vec3) -> Vec3 {
1714 (*self).add(*rhs)
1715 }
1716}
1717
1718impl Add<Vec3> for &f32 {
1719 type Output = Vec3;
1720 #[inline]
1721 fn add(self, rhs: Vec3) -> Vec3 {
1722 (*self).add(rhs)
1723 }
1724}
1725
1726impl Sub for Vec3 {
1727 type Output = Self;
1728 #[inline]
1729 fn sub(self, rhs: Self) -> Self {
1730 Self {
1731 x: self.x.sub(rhs.x),
1732 y: self.y.sub(rhs.y),
1733 z: self.z.sub(rhs.z),
1734 }
1735 }
1736}
1737
1738impl Sub<&Self> for Vec3 {
1739 type Output = Self;
1740 #[inline]
1741 fn sub(self, rhs: &Self) -> Self {
1742 self.sub(*rhs)
1743 }
1744}
1745
1746impl Sub<&Vec3> for &Vec3 {
1747 type Output = Vec3;
1748 #[inline]
1749 fn sub(self, rhs: &Vec3) -> Vec3 {
1750 (*self).sub(*rhs)
1751 }
1752}
1753
1754impl Sub<Vec3> for &Vec3 {
1755 type Output = Vec3;
1756 #[inline]
1757 fn sub(self, rhs: Vec3) -> Vec3 {
1758 (*self).sub(rhs)
1759 }
1760}
1761
1762impl SubAssign for Vec3 {
1763 #[inline]
1764 fn sub_assign(&mut self, rhs: Self) {
1765 self.x.sub_assign(rhs.x);
1766 self.y.sub_assign(rhs.y);
1767 self.z.sub_assign(rhs.z);
1768 }
1769}
1770
1771impl SubAssign<&Self> for Vec3 {
1772 #[inline]
1773 fn sub_assign(&mut self, rhs: &Self) {
1774 self.sub_assign(*rhs);
1775 }
1776}
1777
1778impl Sub<f32> for Vec3 {
1779 type Output = Self;
1780 #[inline]
1781 fn sub(self, rhs: f32) -> Self {
1782 Self {
1783 x: self.x.sub(rhs),
1784 y: self.y.sub(rhs),
1785 z: self.z.sub(rhs),
1786 }
1787 }
1788}
1789
1790impl Sub<&f32> for Vec3 {
1791 type Output = Self;
1792 #[inline]
1793 fn sub(self, rhs: &f32) -> Self {
1794 self.sub(*rhs)
1795 }
1796}
1797
1798impl Sub<&f32> for &Vec3 {
1799 type Output = Vec3;
1800 #[inline]
1801 fn sub(self, rhs: &f32) -> Vec3 {
1802 (*self).sub(*rhs)
1803 }
1804}
1805
1806impl Sub<f32> for &Vec3 {
1807 type Output = Vec3;
1808 #[inline]
1809 fn sub(self, rhs: f32) -> Vec3 {
1810 (*self).sub(rhs)
1811 }
1812}
1813
1814impl SubAssign<f32> for Vec3 {
1815 #[inline]
1816 fn sub_assign(&mut self, rhs: f32) {
1817 self.x.sub_assign(rhs);
1818 self.y.sub_assign(rhs);
1819 self.z.sub_assign(rhs);
1820 }
1821}
1822
1823impl SubAssign<&f32> for Vec3 {
1824 #[inline]
1825 fn sub_assign(&mut self, rhs: &f32) {
1826 self.sub_assign(*rhs);
1827 }
1828}
1829
1830impl Sub<Vec3> for f32 {
1831 type Output = Vec3;
1832 #[inline]
1833 fn sub(self, rhs: Vec3) -> Vec3 {
1834 Vec3 {
1835 x: self.sub(rhs.x),
1836 y: self.sub(rhs.y),
1837 z: self.sub(rhs.z),
1838 }
1839 }
1840}
1841
1842impl Sub<&Vec3> for f32 {
1843 type Output = Vec3;
1844 #[inline]
1845 fn sub(self, rhs: &Vec3) -> Vec3 {
1846 self.sub(*rhs)
1847 }
1848}
1849
1850impl Sub<&Vec3> for &f32 {
1851 type Output = Vec3;
1852 #[inline]
1853 fn sub(self, rhs: &Vec3) -> Vec3 {
1854 (*self).sub(*rhs)
1855 }
1856}
1857
1858impl Sub<Vec3> for &f32 {
1859 type Output = Vec3;
1860 #[inline]
1861 fn sub(self, rhs: Vec3) -> Vec3 {
1862 (*self).sub(rhs)
1863 }
1864}
1865
1866impl Rem for Vec3 {
1867 type Output = Self;
1868 #[inline]
1869 fn rem(self, rhs: Self) -> Self {
1870 Self {
1871 x: self.x.rem(rhs.x),
1872 y: self.y.rem(rhs.y),
1873 z: self.z.rem(rhs.z),
1874 }
1875 }
1876}
1877
1878impl Rem<&Self> for Vec3 {
1879 type Output = Self;
1880 #[inline]
1881 fn rem(self, rhs: &Self) -> Self {
1882 self.rem(*rhs)
1883 }
1884}
1885
1886impl Rem<&Vec3> for &Vec3 {
1887 type Output = Vec3;
1888 #[inline]
1889 fn rem(self, rhs: &Vec3) -> Vec3 {
1890 (*self).rem(*rhs)
1891 }
1892}
1893
1894impl Rem<Vec3> for &Vec3 {
1895 type Output = Vec3;
1896 #[inline]
1897 fn rem(self, rhs: Vec3) -> Vec3 {
1898 (*self).rem(rhs)
1899 }
1900}
1901
1902impl RemAssign for Vec3 {
1903 #[inline]
1904 fn rem_assign(&mut self, rhs: Self) {
1905 self.x.rem_assign(rhs.x);
1906 self.y.rem_assign(rhs.y);
1907 self.z.rem_assign(rhs.z);
1908 }
1909}
1910
1911impl RemAssign<&Self> for Vec3 {
1912 #[inline]
1913 fn rem_assign(&mut self, rhs: &Self) {
1914 self.rem_assign(*rhs);
1915 }
1916}
1917
1918impl Rem<f32> for Vec3 {
1919 type Output = Self;
1920 #[inline]
1921 fn rem(self, rhs: f32) -> Self {
1922 Self {
1923 x: self.x.rem(rhs),
1924 y: self.y.rem(rhs),
1925 z: self.z.rem(rhs),
1926 }
1927 }
1928}
1929
1930impl Rem<&f32> for Vec3 {
1931 type Output = Self;
1932 #[inline]
1933 fn rem(self, rhs: &f32) -> Self {
1934 self.rem(*rhs)
1935 }
1936}
1937
1938impl Rem<&f32> for &Vec3 {
1939 type Output = Vec3;
1940 #[inline]
1941 fn rem(self, rhs: &f32) -> Vec3 {
1942 (*self).rem(*rhs)
1943 }
1944}
1945
1946impl Rem<f32> for &Vec3 {
1947 type Output = Vec3;
1948 #[inline]
1949 fn rem(self, rhs: f32) -> Vec3 {
1950 (*self).rem(rhs)
1951 }
1952}
1953
1954impl RemAssign<f32> for Vec3 {
1955 #[inline]
1956 fn rem_assign(&mut self, rhs: f32) {
1957 self.x.rem_assign(rhs);
1958 self.y.rem_assign(rhs);
1959 self.z.rem_assign(rhs);
1960 }
1961}
1962
1963impl RemAssign<&f32> for Vec3 {
1964 #[inline]
1965 fn rem_assign(&mut self, rhs: &f32) {
1966 self.rem_assign(*rhs);
1967 }
1968}
1969
1970impl Rem<Vec3> for f32 {
1971 type Output = Vec3;
1972 #[inline]
1973 fn rem(self, rhs: Vec3) -> Vec3 {
1974 Vec3 {
1975 x: self.rem(rhs.x),
1976 y: self.rem(rhs.y),
1977 z: self.rem(rhs.z),
1978 }
1979 }
1980}
1981
1982impl Rem<&Vec3> for f32 {
1983 type Output = Vec3;
1984 #[inline]
1985 fn rem(self, rhs: &Vec3) -> Vec3 {
1986 self.rem(*rhs)
1987 }
1988}
1989
1990impl Rem<&Vec3> for &f32 {
1991 type Output = Vec3;
1992 #[inline]
1993 fn rem(self, rhs: &Vec3) -> Vec3 {
1994 (*self).rem(*rhs)
1995 }
1996}
1997
1998impl Rem<Vec3> for &f32 {
1999 type Output = Vec3;
2000 #[inline]
2001 fn rem(self, rhs: Vec3) -> Vec3 {
2002 (*self).rem(rhs)
2003 }
2004}
2005
2006impl AsRef<[f32; 3]> for Vec3 {
2007 #[inline]
2008 fn as_ref(&self) -> &[f32; 3] {
2009 unsafe { &*(self as *const Self as *const [f32; 3]) }
2010 }
2011}
2012
2013impl AsMut<[f32; 3]> for Vec3 {
2014 #[inline]
2015 fn as_mut(&mut self) -> &mut [f32; 3] {
2016 unsafe { &mut *(self as *mut Self as *mut [f32; 3]) }
2017 }
2018}
2019
2020impl Sum for Vec3 {
2021 #[inline]
2022 fn sum<I>(iter: I) -> Self
2023 where
2024 I: Iterator<Item = Self>,
2025 {
2026 iter.fold(Self::ZERO, Self::add)
2027 }
2028}
2029
2030impl<'a> Sum<&'a Self> for Vec3 {
2031 #[inline]
2032 fn sum<I>(iter: I) -> Self
2033 where
2034 I: Iterator<Item = &'a Self>,
2035 {
2036 iter.fold(Self::ZERO, |a, &b| Self::add(a, b))
2037 }
2038}
2039
2040impl Product for Vec3 {
2041 #[inline]
2042 fn product<I>(iter: I) -> Self
2043 where
2044 I: Iterator<Item = Self>,
2045 {
2046 iter.fold(Self::ONE, Self::mul)
2047 }
2048}
2049
2050impl<'a> Product<&'a Self> for Vec3 {
2051 #[inline]
2052 fn product<I>(iter: I) -> Self
2053 where
2054 I: Iterator<Item = &'a Self>,
2055 {
2056 iter.fold(Self::ONE, |a, &b| Self::mul(a, b))
2057 }
2058}
2059
2060impl Neg for Vec3 {
2061 type Output = Self;
2062 #[inline]
2063 fn neg(self) -> Self {
2064 Self {
2065 x: self.x.neg(),
2066 y: self.y.neg(),
2067 z: self.z.neg(),
2068 }
2069 }
2070}
2071
2072impl Neg for &Vec3 {
2073 type Output = Vec3;
2074 #[inline]
2075 fn neg(self) -> Vec3 {
2076 (*self).neg()
2077 }
2078}
2079
2080impl Index<usize> for Vec3 {
2081 type Output = f32;
2082 #[inline]
2083 fn index(&self, index: usize) -> &Self::Output {
2084 match index {
2085 0 => &self.x,
2086 1 => &self.y,
2087 2 => &self.z,
2088 _ => panic!("index out of bounds"),
2089 }
2090 }
2091}
2092
2093impl IndexMut<usize> for Vec3 {
2094 #[inline]
2095 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
2096 match index {
2097 0 => &mut self.x,
2098 1 => &mut self.y,
2099 2 => &mut self.z,
2100 _ => panic!("index out of bounds"),
2101 }
2102 }
2103}
2104
2105impl fmt::Display for Vec3 {
2106 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2107 if let Some(p) = f.precision() {
2108 write!(f, "[{:.*}, {:.*}, {:.*}]", p, self.x, p, self.y, p, self.z)
2109 } else {
2110 write!(f, "[{}, {}, {}]", self.x, self.y, self.z)
2111 }
2112 }
2113}
2114
2115impl fmt::Debug for Vec3 {
2116 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2117 fmt.debug_tuple(stringify!(Vec3))
2118 .field(&self.x)
2119 .field(&self.y)
2120 .field(&self.z)
2121 .finish()
2122 }
2123}
2124
2125impl From<[f32; 3]> for Vec3 {
2126 #[inline]
2127 fn from(a: [f32; 3]) -> Self {
2128 Self::new(a[0], a[1], a[2])
2129 }
2130}
2131
2132impl From<Vec3> for [f32; 3] {
2133 #[inline]
2134 fn from(v: Vec3) -> Self {
2135 [v.x, v.y, v.z]
2136 }
2137}
2138
2139impl From<(f32, f32, f32)> for Vec3 {
2140 #[inline]
2141 fn from(t: (f32, f32, f32)) -> Self {
2142 Self::new(t.0, t.1, t.2)
2143 }
2144}
2145
2146impl From<Vec3> for (f32, f32, f32) {
2147 #[inline]
2148 fn from(v: Vec3) -> Self {
2149 (v.x, v.y, v.z)
2150 }
2151}
2152
2153impl From<(Vec2, f32)> for Vec3 {
2154 #[inline]
2155 fn from((v, z): (Vec2, f32)) -> Self {
2156 Self::new(v.x, v.y, z)
2157 }
2158}
2159
2160impl From<BVec3> for Vec3 {
2161 #[inline]
2162 fn from(v: BVec3) -> Self {
2163 Self::new(f32::from(v.x), f32::from(v.y), f32::from(v.z))
2164 }
2165}
2166
2167impl From<BVec3A> for Vec3 {
2168 #[inline]
2169 fn from(v: BVec3A) -> Self {
2170 let bool_array: [bool; 3] = v.into();
2171 Self::new(
2172 f32::from(bool_array[0]),
2173 f32::from(bool_array[1]),
2174 f32::from(bool_array[2]),
2175 )
2176 }
2177}