hexga_math/geometry/vector/
vector4.rs1use super::*;
2
3#[repr(C)]
5pub struct CoordXYZW<T>
6{
7 pub x : T,
8 pub y : T,
9 pub z : T,
10 pub w : T,
11}
12impl<T> Deref for Vector<T, 4>
13{
14 type Target=CoordXYZW<T>;
15 fn deref(&self) -> &Self::Target { unsafe { std::mem::transmute(self) } }
16}
17impl<T> DerefMut for Vector<T, 4>
18{
19 fn deref_mut(&mut self) -> &mut Self::Target { unsafe { std::mem::transmute(self) } }
20}
21
22pub type Vector4<T> = Vector<T, 4>;
23
24impl<T> Vector<T,4> {
26 pub const fn new(x : T, y : T, z : T, w : T) -> Self { Self::from_array([x,y,z,w]) }
27}
28
29pub trait SplatCoord4 : Sized + Copy { fn splat4(self) -> Vector4<Self> { Vector4::splat(self) }}
30impl<T:Copy> SplatCoord4 for T {}
31
32impl<T> From<(T,T,T,T,)> for Vector4<T> { fn from(value: (T,T,T,T,)) -> Self { Vector4::new(value.0, value.1, value.2, value.3) }}
33impl<T> From<Vector4<T>> for (T,T,T,T,) { fn from(value: Vector4<T>) -> Self { let [x, y, z, w] = value.array; (x,y,z,w,) }}
34
35pub const fn vector4<T>(x : T, y : T, z : T, w : T) -> Vector4<T> { Vector4::new(x, y, z, w) }
36
37pub type Bool4 = Vector4<bool>;
38pub const fn bool4(x : bool, y : bool, z : bool, w : bool) -> Bool4 { Bool4::new(x, y, z, w) }
39
40pub type Vec4 = Vector4<float>;
41pub const fn vec4(x : float, y : float, z : float, w : float) -> Vec4 { Vec4::new(x, y, z, w) }
42pub type Coef4 = Vec4;
43
44pub type Point4 = Vector4<int>;
45pub const fn point4(x : int, y : int, z : int, w : int) -> Point4 { Point4::new(x, y, z, w) }
46
47impl<T> HaveX<T> for Vector4<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 Vector4<T> where T: One + Zero { const X : Self = Vector4::new(T::ONE, T::ZERO, T::ZERO, T::ZERO); }
58impl<T> HaveXAndMinusOne<T> for Vector4<T> where T: MinusOne + Zero { const MINUS_X : Self = Vector4::new(T::MINUS_ONE, T::ZERO, T::ZERO, T::ZERO); }
59
60impl<T> HaveY<T> for Vector4<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 Vector4<T> where T: One + Zero { const Y : Self = Vector4::new(T::ZERO, T::ONE, T::ZERO, T::ZERO); }
71impl<T> HaveYAndMinusOne<T> for Vector4<T> where T: MinusOne + Zero { const MINUS_Y : Self = Vector4::new(T::ZERO, T::MINUS_ONE, T::ZERO, T::ZERO); }
72
73impl<T> HaveZ<T> for Vector4<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 Vector4<T> where T: One + Zero { const Z : Self = Vector4::new(T::ZERO, T::ZERO, T::ONE, T::ZERO); }
84impl<T> HaveZAndMinusOne<T> for Vector4<T> where T: MinusOne + Zero { const MINUS_Z : Self = Vector4::new(T::ZERO, T::ZERO, T::MINUS_ONE, T::ZERO); }
85
86impl<T> HaveW<T> for Vector4<T>
87{
88 fn iter_xyzw<'a>(&'a self) -> impl Iterator<Item=&'a T> where T: 'a {
89 self.array().as_slice()[0..=Self::W_INDEX].iter()
90 }
91
92 fn iter_xyzw_mut<'a>(&'a mut self) -> impl Iterator<Item=&'a mut T> where T: 'a {
93 self.array_mut().as_mut_slice()[0..=Self::W_INDEX].iter_mut()
94 }
95}
96impl<T> HaveWAndOne<T> for Vector4<T> where T: One + Zero { const W : Self = Vector4::new(T::ZERO, T::ZERO, T::ZERO, T::ONE); }
97impl<T> HaveWAndMinusOne<T> for Vector4<T> where T: MinusOne + Zero { const MINUS_W : Self = Vector4::new(T::ZERO, T::ZERO, T::ZERO, T::MINUS_ONE); }
98
99impl<T> From<Vector1<T>> for Vector4<T> where T: Default { fn from(value: Vector1<T>) -> Self { value.resize() } }
100impl<T> From<Vector2<T>> for Vector4<T> where T: Default { fn from(value: Vector2<T>) -> Self { value.resize() } }
101impl<T> From<Vector3<T>> for Vector4<T> where T: Default { fn from(value: Vector3<T>) -> Self { value.resize() } }
102
103pub type Vector4Iter<T> = VectorIter<Vector4<T>, 4>;
104
105pub(crate) mod prelude
106{
107 pub use super::
108 {
109 SplatCoord4,
110 Vector4,vector4,
111 Vec4,vec4,
112 Bool4,bool4,
113 Point4,point4,
114 };
115}