hexga_math/geometry/vector/prelude/
vector3.rs1use crate::*;
2
3#[repr(C)]
5pub struct CoordXYZ<T>
6{
7 pub x : T,
8 pub y : T,
9 pub z : T,
10}
11impl<T> Deref for Vector<T, 3>
12{
13 type Target=CoordXYZ<T>;
14 fn deref(&self) -> &Self::Target { unsafe { std::mem::transmute(self) } }
15}
16impl<T> DerefMut for Vector<T, 3>
17{
18 fn deref_mut(&mut self) -> &mut Self::Target { unsafe { std::mem::transmute(self) } }
19}
20
21pub type Vector3<T> = Vector<T, 3>;
22
23impl<T> Vector<T,3> {
25 pub const fn new(x : T, y : T, z : T) -> Self { Self { array: [x, y, z] }}
26 pub fn with_w(self, w : T) -> Vector4<T> { let [x, y, z] = self.array; Vector4::new(x, y, z, w) }
27}
28
29pub trait SplatCoord3 : Sized + Copy { fn splat3(self) -> Vector3<Self> { Vector3::splat(self) }}
30impl<T:Copy> SplatCoord3 for T {}
31
32impl<T> From<(T,T,T,)> for Vector3<T> { fn from(value: (T,T,T,)) -> Self { Vector3::new(value.0, value.1, value.2) }}
33impl<T> From<Vector3<T>> for (T,T,T,) { fn from(value: Vector3<T>) -> Self { let [x, y, z] = value.array; (x,y,z,) }}
34
35pub const fn vector3<T>(x : T, y : T, z : T) -> Vector3<T> { Vector3::new(x, y, z) }
36
37pub type Bool3 = Vector3<bool>;
38pub const fn bool3(x : bool, y : bool, z : bool) -> Bool3 { Bool3::new(x, y, z) }
39
40pub type Vec3 = Vector3<float>;
41pub const fn vec3(x : float, y : float, z : float) -> Vec3 { Vec3::new(x, y, z) }
42pub type Coef3 = Vec3;
43
44pub type Point3 = Vector3<int>;
45pub const fn point3(x : int, y : int, z : int) -> Point3 { Point3::new(x, y, z) }
46
47impl<T> HaveX<T> for Vector3<T>
48{
49 fn iter_x<'a>(&'a self) -> impl Iterator<Item=&'a T> where T: 'a {
50 self.array().as_slice()[0..=Self::X_INDEX].iter()
51 }
52
53 fn iter_x_mut<'a>(&'a mut self) -> impl Iterator<Item=&'a mut T> where T: 'a {
54 self.array_mut().as_mut_slice()[0..=Self::X_INDEX].iter_mut()
55 }
56}
57impl<T> HaveXAndOne<T> for Vector3<T> where T: One + Zero { const X : Self = Vector3::new(T::ONE, T::ZERO, T::ZERO); }
58impl<T> HaveXAndMinusOne<T> for Vector3<T> where T: MinusOne + Zero { const MINUS_X : Self = Vector3::new(T::MINUS_ONE, T::ZERO, T::ZERO); }
59
60impl<T> HaveY<T> for Vector3<T>
61{
62 fn iter_xy<'a>(&'a self) -> impl Iterator<Item=&'a T> where T: 'a {
63 self.array().as_slice()[0..=Self::Y_INDEX].iter()
64 }
65
66 fn iter_xy_mut<'a>(&'a mut self) -> impl Iterator<Item=&'a mut T> where T: 'a {
67 self.array_mut().as_mut_slice()[0..=Self::Y_INDEX].iter_mut()
68 }
69}
70impl<T> HaveYAndOne<T> for Vector3<T> where T: One + Zero { const Y : Self = Vector3::new(T::ZERO, T::ONE, T::ZERO); }
71impl<T> HaveYAndMinusOne<T> for Vector3<T> where T: MinusOne + Zero { const MINUS_Y : Self = Vector3::new(T::ZERO, T::MINUS_ONE, T::ZERO); }
72
73impl<T> HaveZ<T> for Vector3<T>
74{
75 fn iter_xyz<'a>(&'a self) -> impl Iterator<Item=&'a T> where T: 'a {
76 self.array().as_slice()[0..=Self::Z_INDEX].iter()
77 }
78
79 fn iter_xyz_mut<'a>(&'a mut self) -> impl Iterator<Item=&'a mut T> where T: 'a {
80 self.array_mut().as_mut_slice()[0..=Self::Z_INDEX].iter_mut()
81 }
82}
83impl<T> HaveZAndOne<T> for Vector3<T> where T: One + Zero { const Z : Self = Vector3::new(T::ZERO, T::ZERO, T::ONE); }
84impl<T> HaveZAndMinusOne<T> for Vector3<T> where T: MinusOne + Zero { const MINUS_Z : Self = Vector3::new(T::ZERO, T::ZERO, T::MINUS_ONE); }
85
86impl<T> From<Vector1<T>> for Vector3<T> where T: Default { fn from(value: Vector1<T>) -> Self { value.to_vector3() } }
87impl<T> From<Vector2<T>> for Vector3<T> where T: Default { fn from(value: Vector2<T>) -> Self { value.to_vector3() } }
88impl<T> From<Vector4<T>> for Vector3<T> where T: Default { fn from(value: Vector4<T>) -> Self { value.to_vector3() } }
89
90pub type Vector3Iter<T> = VectorIter<Vector3<T>, 3>;