1use crate::{
4 euler::{EulerRot, FromEuler, ToEuler},
5 f32::math,
6 neon::*,
7 Mat3, Mat3A, Mat4, Vec2, Vec3, Vec3A, Vec4,
8};
9
10#[cfg(feature = "f64")]
11use crate::DQuat;
12
13use core::arch::aarch64::*;
14
15use core::fmt;
16use core::iter::{Product, Sum};
17use core::ops::{
18 Add, AddAssign, Deref, DerefMut, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign,
19};
20
21#[cfg(feature = "zerocopy")]
22use zerocopy_derive::*;
23
24#[repr(C)]
25union UnionCast {
26 a: [f32; 4],
27 v: Quat,
28}
29
30#[inline]
35#[must_use]
36pub const fn quat(x: f32, y: f32, z: f32, w: f32) -> Quat {
37 Quat::from_xyzw(x, y, z, w)
38}
39
40#[derive(Clone, Copy)]
50#[cfg_attr(feature = "bytemuck", derive(bytemuck::Pod, bytemuck::Zeroable))]
51#[cfg_attr(
52 feature = "zerocopy",
53 derive(FromBytes, Immutable, IntoBytes, KnownLayout)
54)]
55#[repr(transparent)]
56pub struct Quat(pub(crate) float32x4_t);
57
58impl Quat {
59 const ZERO: Self = Self::from_array([0.0; 4]);
61
62 pub const IDENTITY: Self = Self::from_xyzw(0.0, 0.0, 0.0, 1.0);
64
65 pub const NAN: Self = Self::from_array([f32::NAN; 4]);
67
68 #[inline(always)]
80 #[must_use]
81 pub const fn from_xyzw(x: f32, y: f32, z: f32, w: f32) -> Self {
82 unsafe { UnionCast { a: [x, y, z, w] }.v }
83 }
84
85 #[inline]
92 #[must_use]
93 pub const fn from_array(a: [f32; 4]) -> Self {
94 Self::from_xyzw(a[0], a[1], a[2], a[3])
95 }
96
97 #[inline]
104 #[must_use]
105 pub const fn from_vec4(v: Vec4) -> Self {
106 Self(v.0)
107 }
108
109 #[inline]
120 #[must_use]
121 pub fn from_slice(slice: &[f32]) -> Self {
122 assert!(slice.len() >= 4);
123 Self(unsafe { vld1q_f32(slice.as_ptr()) })
124 }
125
126 #[inline]
132 pub fn write_to_slice(self, slice: &mut [f32]) {
133 assert!(slice.len() >= 4);
134 unsafe { vst1q_f32(slice.as_mut_ptr(), self.0) }
135 }
136
137 #[inline]
145 #[must_use]
146 pub fn from_axis_angle(axis: Vec3, angle: f32) -> Self {
147 glam_assert!(axis.is_normalized());
148 let (s, c) = math::sin_cos(angle * 0.5);
149 let v = axis * s;
150 Self::from_xyzw(v.x, v.y, v.z, c)
151 }
152
153 #[inline]
157 #[must_use]
158 pub fn from_scaled_axis(v: Vec3) -> Self {
159 let length = v.length();
160 if length == 0.0 {
161 Self::IDENTITY
162 } else {
163 Self::from_axis_angle(v / length, length)
164 }
165 }
166
167 #[inline]
169 #[must_use]
170 pub fn from_rotation_x(angle: f32) -> Self {
171 let (s, c) = math::sin_cos(angle * 0.5);
172 Self::from_xyzw(s, 0.0, 0.0, c)
173 }
174
175 #[inline]
177 #[must_use]
178 pub fn from_rotation_y(angle: f32) -> Self {
179 let (s, c) = math::sin_cos(angle * 0.5);
180 Self::from_xyzw(0.0, s, 0.0, c)
181 }
182
183 #[inline]
185 #[must_use]
186 pub fn from_rotation_z(angle: f32) -> Self {
187 let (s, c) = math::sin_cos(angle * 0.5);
188 Self::from_xyzw(0.0, 0.0, s, c)
189 }
190
191 #[inline]
193 #[must_use]
194 pub fn from_euler(euler: EulerRot, a: f32, b: f32, c: f32) -> Self {
195 Self::from_euler_angles(euler, a, b, c)
196 }
197
198 #[inline]
207 #[must_use]
208 pub fn from_rotation_axes(x_axis: Vec3, y_axis: Vec3, z_axis: Vec3) -> Self {
209 glam_assert!(x_axis.is_normalized() && y_axis.is_normalized() && z_axis.is_normalized());
210 let (m00, m01, m02) = x_axis.into();
212 let (m10, m11, m12) = y_axis.into();
213 let (m20, m21, m22) = z_axis.into();
214 if m22 <= 0.0 {
215 let dif10 = m11 - m00;
217 let omm22 = 1.0 - m22;
218 if dif10 <= 0.0 {
219 let four_xsq = omm22 - dif10;
221 let inv4x = 0.5 / math::sqrt(four_xsq);
222 Self::from_xyzw(
223 four_xsq * inv4x,
224 (m01 + m10) * inv4x,
225 (m02 + m20) * inv4x,
226 (m12 - m21) * inv4x,
227 )
228 } else {
229 let four_ysq = omm22 + dif10;
231 let inv4y = 0.5 / math::sqrt(four_ysq);
232 Self::from_xyzw(
233 (m01 + m10) * inv4y,
234 four_ysq * inv4y,
235 (m12 + m21) * inv4y,
236 (m20 - m02) * inv4y,
237 )
238 }
239 } else {
240 let sum10 = m11 + m00;
242 let opm22 = 1.0 + m22;
243 if sum10 <= 0.0 {
244 let four_zsq = opm22 - sum10;
246 let inv4z = 0.5 / math::sqrt(four_zsq);
247 Self::from_xyzw(
248 (m02 + m20) * inv4z,
249 (m12 + m21) * inv4z,
250 four_zsq * inv4z,
251 (m01 - m10) * inv4z,
252 )
253 } else {
254 let four_wsq = opm22 + sum10;
256 let inv4w = 0.5 / math::sqrt(four_wsq);
257 Self::from_xyzw(
258 (m12 - m21) * inv4w,
259 (m20 - m02) * inv4w,
260 (m01 - m10) * inv4w,
261 four_wsq * inv4w,
262 )
263 }
264 }
265 }
266
267 #[inline]
276 #[must_use]
277 pub fn from_mat3(mat: &Mat3) -> Self {
278 Self::from_rotation_axes(mat.x_axis, mat.y_axis, mat.z_axis)
279 }
280
281 #[inline]
290 #[must_use]
291 pub fn from_mat3a(mat: &Mat3A) -> Self {
292 Self::from_rotation_axes(mat.x_axis.into(), mat.y_axis.into(), mat.z_axis.into())
293 }
294
295 #[inline]
305 #[must_use]
306 pub fn from_mat4(mat: &Mat4) -> Self {
307 Self::from_rotation_axes(
308 mat.x_axis.truncate(),
309 mat.y_axis.truncate(),
310 mat.z_axis.truncate(),
311 )
312 }
313
314 #[must_use]
328 pub fn from_rotation_arc(from: Vec3, to: Vec3) -> Self {
329 glam_assert!(from.is_normalized());
330 glam_assert!(to.is_normalized());
331
332 const ONE_MINUS_EPS: f32 = 1.0 - 2.0 * f32::EPSILON;
333 let dot = from.dot(to);
334 if dot > ONE_MINUS_EPS {
335 Self::IDENTITY
337 } else if dot < -ONE_MINUS_EPS {
338 use core::f32::consts::PI; Self::from_axis_angle(from.any_orthonormal_vector(), PI)
341 } else {
342 let c = from.cross(to);
343 Self::from_xyzw(c.x, c.y, c.z, 1.0 + dot).normalize()
344 }
345 }
346
347 #[inline]
361 #[must_use]
362 pub fn from_rotation_arc_colinear(from: Vec3, to: Vec3) -> Self {
363 if from.dot(to) < 0.0 {
364 Self::from_rotation_arc(from, -to)
365 } else {
366 Self::from_rotation_arc(from, to)
367 }
368 }
369
370 #[must_use]
384 pub fn from_rotation_arc_2d(from: Vec2, to: Vec2) -> Self {
385 glam_assert!(from.is_normalized());
386 glam_assert!(to.is_normalized());
387
388 const ONE_MINUS_EPSILON: f32 = 1.0 - 2.0 * f32::EPSILON;
389 let dot = from.dot(to);
390 if dot > ONE_MINUS_EPSILON {
391 Self::IDENTITY
393 } else if dot < -ONE_MINUS_EPSILON {
394 const COS_FRAC_PI_2: f32 = 0.0;
396 const SIN_FRAC_PI_2: f32 = 1.0;
397 Self::from_xyzw(0.0, 0.0, SIN_FRAC_PI_2, COS_FRAC_PI_2)
399 } else {
400 let z = from.x * to.y - to.x * from.y;
402 let w = 1.0 + dot;
403 let len_rcp = 1.0 / math::sqrt(z * z + w * w);
405 Self::from_xyzw(0.0, 0.0, z * len_rcp, w * len_rcp)
406 }
407 }
408
409 #[inline]
417 #[must_use]
418 pub fn look_to_lh(dir: Vec3, up: Vec3) -> Self {
419 Self::look_to_rh(-dir, up)
420 }
421
422 #[inline]
430 #[must_use]
431 pub fn look_to_rh(dir: Vec3, up: Vec3) -> Self {
432 glam_assert!(dir.is_normalized());
433 glam_assert!(up.is_normalized());
434 let f = dir;
435 let s = f.cross(up).normalize();
436 let u = s.cross(f);
437
438 Self::from_rotation_axes(
439 Vec3::new(s.x, u.x, -f.x),
440 Vec3::new(s.y, u.y, -f.y),
441 Vec3::new(s.z, u.z, -f.z),
442 )
443 }
444
445 #[inline]
454 #[must_use]
455 pub fn look_at_lh(eye: Vec3, center: Vec3, up: Vec3) -> Self {
456 Self::look_to_lh(center.sub(eye).normalize(), up)
457 }
458
459 #[inline]
468 #[must_use]
469 pub fn look_at_rh(eye: Vec3, center: Vec3, up: Vec3) -> Self {
470 Self::look_to_rh(center.sub(eye).normalize(), up)
471 }
472
473 #[inline]
475 #[must_use]
476 pub fn to_axis_angle(self) -> (Vec3, f32) {
477 const EPSILON: f32 = 1.0e-8;
478 let v = Vec3::new(self.x, self.y, self.z);
479 let length = v.length();
480 if length >= EPSILON {
481 let angle = 2.0 * math::atan2(length, self.w);
482 let axis = v / length;
483 (axis, angle)
484 } else {
485 (Vec3::X, 0.0)
486 }
487 }
488
489 #[inline]
491 #[must_use]
492 pub fn to_scaled_axis(self) -> Vec3 {
493 let (axis, angle) = self.to_axis_angle();
494 axis * angle
495 }
496
497 #[inline]
499 #[must_use]
500 pub fn to_euler(self, order: EulerRot) -> (f32, f32, f32) {
501 self.to_euler_angles(order)
502 }
503
504 #[inline]
506 #[must_use]
507 pub fn to_array(self) -> [f32; 4] {
508 [self.x, self.y, self.z, self.w]
509 }
510
511 #[inline]
513 #[must_use]
514 pub fn xyz(self) -> Vec3 {
515 Vec3::new(self.x, self.y, self.z)
516 }
517
518 #[inline]
521 #[must_use]
522 pub fn conjugate(self) -> Self {
523 const SIGN: float32x4_t = f32x4_from_array([-1.0, -1.0, -1.0, 1.0]);
524 Self(unsafe { vmulq_f32(self.0, SIGN) })
525 }
526
527 #[inline]
537 #[must_use]
538 pub fn inverse(self) -> Self {
539 glam_assert!(self.is_normalized());
540 self.conjugate()
541 }
542
543 #[inline]
546 #[must_use]
547 pub fn dot(self, rhs: Self) -> f32 {
548 Vec4::from(self).dot(Vec4::from(rhs))
549 }
550
551 #[doc(alias = "magnitude")]
553 #[inline]
554 #[must_use]
555 pub fn length(self) -> f32 {
556 Vec4::from(self).length()
557 }
558
559 #[doc(alias = "magnitude2")]
564 #[inline]
565 #[must_use]
566 pub fn length_squared(self) -> f32 {
567 Vec4::from(self).length_squared()
568 }
569
570 #[inline]
574 #[must_use]
575 pub fn length_recip(self) -> f32 {
576 Vec4::from(self).length_recip()
577 }
578
579 #[inline]
587 #[must_use]
588 pub fn normalize(self) -> Self {
589 Self::from_vec4(Vec4::from(self).normalize())
590 }
591
592 #[inline]
595 #[must_use]
596 pub fn is_finite(self) -> bool {
597 Vec4::from(self).is_finite()
598 }
599
600 #[inline]
602 #[must_use]
603 pub fn is_nan(self) -> bool {
604 Vec4::from(self).is_nan()
605 }
606
607 #[inline]
611 #[must_use]
612 pub fn is_normalized(self) -> bool {
613 Vec4::from(self).is_normalized()
614 }
615
616 #[inline]
617 #[must_use]
618 pub fn is_near_identity(self) -> bool {
619 const THRESHOLD_ANGLE: f32 = 0.002_847_144_6;
637 let positive_w_angle = math::acos_approx(math::abs(self.w)) * 2.0;
638 positive_w_angle < THRESHOLD_ANGLE
639 }
640
641 #[inline]
650 #[must_use]
651 pub fn angle_between(self, rhs: Self) -> f32 {
652 glam_assert!(self.is_normalized() && rhs.is_normalized());
653 math::acos_approx(math::abs(self.dot(rhs))) * 2.0
654 }
655
656 #[inline]
668 #[must_use]
669 pub fn rotate_towards(self, rhs: Self, max_angle: f32) -> Self {
670 glam_assert!(self.is_normalized() && rhs.is_normalized());
671 let angle = self.angle_between(rhs);
672 if angle <= 1e-4 {
673 return rhs;
674 }
675 let s = (max_angle / angle).clamp(-1.0, 1.0);
676 self.slerp(rhs, s)
677 }
678
679 #[inline]
689 #[must_use]
690 pub fn abs_diff_eq(self, rhs: Self, max_abs_diff: f32) -> bool {
691 Vec4::from(self).abs_diff_eq(Vec4::from(rhs), max_abs_diff)
692 }
693
694 #[inline(always)]
695 #[must_use]
696 fn lerp_impl(self, end: Self, s: f32) -> Self {
697 (self * (1.0 - s) + end * s).normalize()
698 }
699
700 #[doc(alias = "mix")]
710 #[inline]
711 #[must_use]
712 pub fn lerp(self, end: Self, s: f32) -> Self {
713 glam_assert!(self.is_normalized());
714 glam_assert!(end.is_normalized());
715
716 const NEG_ZERO: float32x4_t = f32x4_from_array([-0.0; 4]);
717 unsafe {
718 let dot = dot4_into_f32x4(self.0, end.0);
719 let bias = vandq_u32(vreinterpretq_u32_f32(dot), vreinterpretq_u32_f32(NEG_ZERO));
722 self.lerp_impl(
723 Self(vreinterpretq_f32_u32(veorq_u32(
724 vreinterpretq_u32_f32(end.0),
725 bias,
726 ))),
727 s,
728 )
729 }
730 }
731
732 #[inline]
742 #[must_use]
743 pub fn slerp(self, mut end: Self, s: f32) -> Self {
744 glam_assert!(self.is_normalized());
746 glam_assert!(end.is_normalized());
747
748 let mut dot = self.dot(end);
755 if dot < 0.0 {
756 end = -end;
757 dot = -dot;
758 }
759
760 const DOT_THRESHOLD: f32 = 1.0 - f32::EPSILON;
761 if dot > DOT_THRESHOLD {
762 self.lerp_impl(end, s)
764 } else {
765 let theta = math::acos_approx(dot);
766
767 let scale1 = math::sin(theta * (1.0 - s));
768 let scale2 = math::sin(theta * s);
769 let theta_sin = math::sin(theta);
770 ((self * scale1) + (end * scale2)) * (1.0 / theta_sin)
771 }
772 }
773
774 #[inline]
780 #[must_use]
781 pub fn mul_vec3(self, rhs: Vec3) -> Vec3 {
782 glam_assert!(self.is_normalized());
783
784 self.mul_vec3a(rhs.into()).into()
785 }
786
787 #[inline]
796 #[must_use]
797 pub fn mul_quat(self, rhs: Self) -> Self {
798 unsafe {
799 let lhs = self.0;
800 let rhs = rhs.0;
801
802 const CONTROL_WZYX: float32x4_t = f32x4_from_array([1.0, -1.0, 1.0, -1.0]);
803 const CONTROL_ZWXY: float32x4_t = f32x4_from_array([1.0, 1.0, -1.0, -1.0]);
804 const CONTROL_YXWZ: float32x4_t = f32x4_from_array([-1.0, 1.0, 1.0, -1.0]);
805
806 let r_xxxx = vdupq_laneq_f32(lhs, 0);
807 let r_yyyy = vdupq_laneq_f32(lhs, 1);
808 let r_zzzz = vdupq_laneq_f32(lhs, 2);
809 let r_wwww = vdupq_laneq_f32(lhs, 3);
810
811 let lxrw_lyrw_lzrw_lwrw = vmulq_f32(r_wwww, rhs);
812 let l_wzyx = vrev64q_f32(rhs);
814 let l_wzyx = vextq_f32(l_wzyx, l_wzyx, 2);
815
816 let lwrx_lzrx_lyrx_lxrx = vmulq_f32(r_xxxx, l_wzyx);
817 let l_zwxy = vrev64q_f32(l_wzyx);
819
820 let lwrx_nlzrx_lyrx_nlxrx = vmulq_f32(lwrx_lzrx_lyrx_lxrx, CONTROL_WZYX);
821
822 let lzry_lwry_lxry_lyry = vmulq_f32(r_yyyy, l_zwxy);
823 let l_yxwz = vrev64q_f32(l_zwxy);
825 let l_yxwz = vextq_f32(l_yxwz, l_yxwz, 2);
826
827 let lzry_lwry_nlxry_nlyry = vmulq_f32(lzry_lwry_lxry_lyry, CONTROL_ZWXY);
828
829 let lyrz_lxrz_lwrz_lzrz = vmulq_f32(r_zzzz, l_yxwz);
830 let result0 = vaddq_f32(lxrw_lyrw_lzrw_lwrw, lwrx_nlzrx_lyrx_nlxrx);
831
832 let nlyrz_lxrz_lwrz_wlzrz = vmulq_f32(lyrz_lxrz_lwrz_lzrz, CONTROL_YXWZ);
833 let result1 = vaddq_f32(lzry_lwry_nlxry_nlyry, nlyrz_lxrz_lwrz_wlzrz);
834 Self(vaddq_f32(result0, result1))
835 }
836 }
837
838 #[inline]
848 #[must_use]
849 pub fn from_affine3(a: &crate::Affine3) -> Self {
850 Self::from_rotation_axes(a.matrix3.x_axis, a.matrix3.y_axis, a.matrix3.z_axis)
851 }
852
853 #[inline]
863 #[must_use]
864 pub fn from_affine3a(a: &crate::Affine3A) -> Self {
865 Self::from_rotation_axes(
866 a.matrix3.x_axis.into(),
867 a.matrix3.y_axis.into(),
868 a.matrix3.z_axis.into(),
869 )
870 }
871
872 #[inline]
874 #[must_use]
875 pub fn mul_vec3a(self, rhs: Vec3A) -> Vec3A {
876 unsafe {
877 let w = self.w;
878 let b = Vec3A::from(self.0);
879 let b2 = b.length_squared();
880 Vec3A(vaddq_f32(
881 vaddq_f32(
882 vmulq_n_f32(rhs.0, (w * w) - b2),
883 vmulq_n_f32(b.0, rhs.dot(b) * 2.0),
884 ),
885 vmulq_n_f32(b.cross(rhs).0, w * 2.0),
886 ))
887 }
888 }
889
890 #[cfg(feature = "f64")]
891 #[inline]
892 #[must_use]
893 pub fn as_dquat(self) -> DQuat {
894 DQuat::from_xyzw(self.x as f64, self.y as f64, self.z as f64, self.w as f64)
895 }
896}
897
898impl fmt::Debug for Quat {
899 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
900 fmt.debug_tuple(stringify!(Quat))
901 .field(&self.x)
902 .field(&self.y)
903 .field(&self.z)
904 .field(&self.w)
905 .finish()
906 }
907}
908
909impl fmt::Display for Quat {
910 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
911 if let Some(p) = f.precision() {
912 write!(
913 f,
914 "[{:.*}, {:.*}, {:.*}, {:.*}]",
915 p, self.x, p, self.y, p, self.z, p, self.w
916 )
917 } else {
918 write!(f, "[{}, {}, {}, {}]", self.x, self.y, self.z, self.w)
919 }
920 }
921}
922
923impl Add for Quat {
924 type Output = Self;
925 #[inline]
932 fn add(self, rhs: Self) -> Self {
933 Self::from_vec4(Vec4::from(self) + Vec4::from(rhs))
934 }
935}
936
937impl Add<&Self> for Quat {
938 type Output = Self;
939 #[inline]
940 fn add(self, rhs: &Self) -> Self {
941 self.add(*rhs)
942 }
943}
944
945impl Add<&Quat> for &Quat {
946 type Output = Quat;
947 #[inline]
948 fn add(self, rhs: &Quat) -> Quat {
949 (*self).add(*rhs)
950 }
951}
952
953impl Add<Quat> for &Quat {
954 type Output = Quat;
955 #[inline]
956 fn add(self, rhs: Quat) -> Quat {
957 (*self).add(rhs)
958 }
959}
960
961impl AddAssign for Quat {
962 #[inline]
963 fn add_assign(&mut self, rhs: Self) {
964 *self = self.add(rhs);
965 }
966}
967
968impl AddAssign<&Self> for Quat {
969 #[inline]
970 fn add_assign(&mut self, rhs: &Self) {
971 self.add_assign(*rhs);
972 }
973}
974
975impl Sub for Quat {
976 type Output = Self;
977 #[inline]
981 fn sub(self, rhs: Self) -> Self {
982 Self::from_vec4(Vec4::from(self) - Vec4::from(rhs))
983 }
984}
985
986impl Sub<&Self> for Quat {
987 type Output = Self;
988 #[inline]
989 fn sub(self, rhs: &Self) -> Self {
990 self.sub(*rhs)
991 }
992}
993
994impl Sub<&Quat> for &Quat {
995 type Output = Quat;
996 #[inline]
997 fn sub(self, rhs: &Quat) -> Quat {
998 (*self).sub(*rhs)
999 }
1000}
1001
1002impl Sub<Quat> for &Quat {
1003 type Output = Quat;
1004 #[inline]
1005 fn sub(self, rhs: Quat) -> Quat {
1006 (*self).sub(rhs)
1007 }
1008}
1009
1010impl SubAssign for Quat {
1011 #[inline]
1012 fn sub_assign(&mut self, rhs: Self) {
1013 *self = self.sub(rhs);
1014 }
1015}
1016
1017impl SubAssign<&Self> for Quat {
1018 #[inline]
1019 fn sub_assign(&mut self, rhs: &Self) {
1020 self.sub_assign(*rhs);
1021 }
1022}
1023
1024impl Mul<f32> for Quat {
1025 type Output = Self;
1026 #[inline]
1030 fn mul(self, rhs: f32) -> Self {
1031 Self::from_vec4(Vec4::from(self) * rhs)
1032 }
1033}
1034
1035impl Mul<&f32> for Quat {
1036 type Output = Self;
1037 #[inline]
1038 fn mul(self, rhs: &f32) -> Self {
1039 self.mul(*rhs)
1040 }
1041}
1042
1043impl Mul<&f32> for &Quat {
1044 type Output = Quat;
1045 #[inline]
1046 fn mul(self, rhs: &f32) -> Quat {
1047 (*self).mul(*rhs)
1048 }
1049}
1050
1051impl Mul<f32> for &Quat {
1052 type Output = Quat;
1053 #[inline]
1054 fn mul(self, rhs: f32) -> Quat {
1055 (*self).mul(rhs)
1056 }
1057}
1058
1059impl MulAssign<f32> for Quat {
1060 #[inline]
1061 fn mul_assign(&mut self, rhs: f32) {
1062 *self = self.mul(rhs);
1063 }
1064}
1065
1066impl MulAssign<&f32> for Quat {
1067 #[inline]
1068 fn mul_assign(&mut self, rhs: &f32) {
1069 self.mul_assign(*rhs);
1070 }
1071}
1072
1073impl Div<f32> for Quat {
1074 type Output = Self;
1075 #[inline]
1078 fn div(self, rhs: f32) -> Self {
1079 Self::from_vec4(Vec4::from(self) / rhs)
1080 }
1081}
1082
1083impl Div<&f32> for Quat {
1084 type Output = Self;
1085 #[inline]
1086 fn div(self, rhs: &f32) -> Self {
1087 self.div(*rhs)
1088 }
1089}
1090
1091impl Div<&f32> for &Quat {
1092 type Output = Quat;
1093 #[inline]
1094 fn div(self, rhs: &f32) -> Quat {
1095 (*self).div(*rhs)
1096 }
1097}
1098
1099impl Div<f32> for &Quat {
1100 type Output = Quat;
1101 #[inline]
1102 fn div(self, rhs: f32) -> Quat {
1103 (*self).div(rhs)
1104 }
1105}
1106
1107impl DivAssign<f32> for Quat {
1108 #[inline]
1109 fn div_assign(&mut self, rhs: f32) {
1110 *self = self.div(rhs);
1111 }
1112}
1113
1114impl DivAssign<&f32> for Quat {
1115 #[inline]
1116 fn div_assign(&mut self, rhs: &f32) {
1117 self.div_assign(*rhs);
1118 }
1119}
1120
1121impl Mul for Quat {
1122 type Output = Self;
1123 #[inline]
1133 fn mul(self, rhs: Self) -> Self {
1134 self.mul_quat(rhs)
1135 }
1136}
1137
1138impl Mul<&Self> for Quat {
1139 type Output = Self;
1140 #[inline]
1141 fn mul(self, rhs: &Self) -> Self {
1142 self.mul(*rhs)
1143 }
1144}
1145
1146impl Mul<&Quat> for &Quat {
1147 type Output = Quat;
1148 #[inline]
1149 fn mul(self, rhs: &Quat) -> Quat {
1150 (*self).mul(*rhs)
1151 }
1152}
1153
1154impl Mul<Quat> for &Quat {
1155 type Output = Quat;
1156 #[inline]
1157 fn mul(self, rhs: Quat) -> Quat {
1158 (*self).mul(rhs)
1159 }
1160}
1161
1162impl MulAssign for Quat {
1163 #[inline]
1164 fn mul_assign(&mut self, rhs: Self) {
1165 *self = self.mul(rhs);
1166 }
1167}
1168
1169impl MulAssign<&Self> for Quat {
1170 #[inline]
1171 fn mul_assign(&mut self, rhs: &Self) {
1172 self.mul_assign(*rhs);
1173 }
1174}
1175
1176impl Mul<Vec3> for Quat {
1177 type Output = Vec3;
1178 #[inline]
1184 fn mul(self, rhs: Vec3) -> Self::Output {
1185 self.mul_vec3(rhs)
1186 }
1187}
1188
1189impl Mul<&Vec3> for Quat {
1190 type Output = Vec3;
1191 #[inline]
1192 fn mul(self, rhs: &Vec3) -> Vec3 {
1193 self.mul(*rhs)
1194 }
1195}
1196
1197impl Mul<&Vec3> for &Quat {
1198 type Output = Vec3;
1199 #[inline]
1200 fn mul(self, rhs: &Vec3) -> Vec3 {
1201 (*self).mul(*rhs)
1202 }
1203}
1204
1205impl Mul<Vec3> for &Quat {
1206 type Output = Vec3;
1207 #[inline]
1208 fn mul(self, rhs: Vec3) -> Vec3 {
1209 (*self).mul(rhs)
1210 }
1211}
1212
1213impl Mul<Vec3A> for Quat {
1214 type Output = Vec3A;
1215 #[inline]
1216 fn mul(self, rhs: Vec3A) -> Self::Output {
1217 self.mul_vec3a(rhs)
1218 }
1219}
1220
1221impl Mul<&Vec3A> for Quat {
1222 type Output = Vec3A;
1223 #[inline]
1224 fn mul(self, rhs: &Vec3A) -> Vec3A {
1225 self.mul(*rhs)
1226 }
1227}
1228
1229impl Mul<&Vec3A> for &Quat {
1230 type Output = Vec3A;
1231 #[inline]
1232 fn mul(self, rhs: &Vec3A) -> Vec3A {
1233 (*self).mul(*rhs)
1234 }
1235}
1236
1237impl Mul<Vec3A> for &Quat {
1238 type Output = Vec3A;
1239 #[inline]
1240 fn mul(self, rhs: Vec3A) -> Vec3A {
1241 (*self).mul(rhs)
1242 }
1243}
1244
1245impl Neg for Quat {
1246 type Output = Self;
1247 #[inline]
1248 fn neg(self) -> Self {
1249 self * -1.0
1250 }
1251}
1252
1253impl Neg for &Quat {
1254 type Output = Quat;
1255 #[inline]
1256 fn neg(self) -> Quat {
1257 (*self).neg()
1258 }
1259}
1260
1261impl Default for Quat {
1262 #[inline]
1263 fn default() -> Self {
1264 Self::IDENTITY
1265 }
1266}
1267
1268impl PartialEq for Quat {
1269 #[inline]
1270 fn eq(&self, rhs: &Self) -> bool {
1271 Vec4::from(*self).eq(&Vec4::from(*rhs))
1272 }
1273}
1274
1275impl AsRef<[f32; 4]> for Quat {
1276 #[inline]
1277 fn as_ref(&self) -> &[f32; 4] {
1278 unsafe { &*(self as *const Self as *const [f32; 4]) }
1279 }
1280}
1281
1282impl Sum<Self> for Quat {
1283 fn sum<I>(iter: I) -> Self
1284 where
1285 I: Iterator<Item = Self>,
1286 {
1287 iter.fold(Self::ZERO, Self::add)
1288 }
1289}
1290
1291impl<'a> Sum<&'a Self> for Quat {
1292 fn sum<I>(iter: I) -> Self
1293 where
1294 I: Iterator<Item = &'a Self>,
1295 {
1296 iter.fold(Self::ZERO, |a, &b| Self::add(a, b))
1297 }
1298}
1299
1300impl Product for Quat {
1301 fn product<I>(iter: I) -> Self
1302 where
1303 I: Iterator<Item = Self>,
1304 {
1305 iter.fold(Self::IDENTITY, Self::mul)
1306 }
1307}
1308
1309impl<'a> Product<&'a Self> for Quat {
1310 fn product<I>(iter: I) -> Self
1311 where
1312 I: Iterator<Item = &'a Self>,
1313 {
1314 iter.fold(Self::IDENTITY, |a, &b| Self::mul(a, b))
1315 }
1316}
1317
1318impl From<Quat> for Vec4 {
1319 #[inline]
1320 fn from(q: Quat) -> Self {
1321 Self(q.0)
1322 }
1323}
1324
1325impl From<Quat> for (f32, f32, f32, f32) {
1326 #[inline]
1327 fn from(q: Quat) -> Self {
1328 Vec4::from(q).into()
1329 }
1330}
1331
1332impl From<Quat> for [f32; 4] {
1333 #[inline]
1334 fn from(q: Quat) -> Self {
1335 Vec4::from(q).into()
1336 }
1337}
1338
1339impl From<Quat> for float32x4_t {
1340 #[inline]
1341 fn from(q: Quat) -> Self {
1342 q.0
1343 }
1344}
1345
1346impl Deref for Quat {
1347 type Target = crate::deref::Vec4<f32>;
1348 #[inline]
1349 fn deref(&self) -> &Self::Target {
1350 unsafe { &*(self as *const Self).cast() }
1351 }
1352}
1353
1354impl DerefMut for Quat {
1355 #[inline]
1356 fn deref_mut(&mut self) -> &mut Self::Target {
1357 unsafe { &mut *(self as *mut Self).cast() }
1358 }
1359}