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
30{
31 fn splat4(self) -> Vector4<Self> { Vector4::splat(self) }
32}
33impl<T: Copy> SplatCoord4 for T {}
34
35impl<T> From<(T, T, T, T)> for Vector4<T>
36{
37 fn from(value: (T, T, T, T)) -> Self { Vector4::new(value.0, value.1, value.2, value.3) }
38}
39impl<T> From<Vector4<T>> for (T, T, T, T)
40{
41 fn from(value: Vector4<T>) -> Self
42 {
43 let [x, y, z, w] = value.array;
44 (x, y, z, w)
45 }
46}
47
48pub const fn vector4<T>(x: T, y: T, z: T, w: T) -> Vector4<T> { Vector4::new(x, y, z, w) }
49
50pub type Bool4 = Bool<4>;
51pub const fn vec4b(x: bool, y: bool, z: bool, w: bool) -> Bool4 { Bool4::new(x, y, z, w) }
52
53pub type Vec4 = Vector4<float>;
54pub const fn vec4(x: float, y: float, z: float, w: float) -> Vec4 { Vec4::new(x, y, z, w) }
55pub type Coef4 = Vec4;
56
57pub type Point4 = Point<4>;
58pub const fn point4(x: int, y: int, z: int, w: int) -> Point4 { Point4::new(x, y, z, w) }
59
60impl<T> HaveX<T> for Vector4<T>
61{
62 fn iter_x<'a>(&'a self) -> impl Iterator<Item = &'a T>
63 where
64 T: 'a,
65 {
66 self.array().as_slice()[0..=Self::X_INDEX].iter()
67 }
68
69 fn iter_x_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut T>
70 where
71 T: 'a,
72 {
73 self.array_mut().as_mut_slice()[0..=Self::X_INDEX].iter_mut()
74 }
75}
76impl<T> HaveXAndOne<T> for Vector4<T>
77where
78 T: One + Zero,
79{
80 const X: Self = Vector4::new(T::ONE, T::ZERO, T::ZERO, T::ZERO);
81}
82impl<T> HaveXAndMinusOne<T> for Vector4<T>
83where
84 T: MinusOne + Zero,
85{
86 const MINUS_X: Self = Vector4::new(T::MINUS_ONE, T::ZERO, T::ZERO, T::ZERO);
87}
88
89impl<T> HaveY<T> for Vector4<T>
90{
91 fn iter_xy<'a>(&'a self) -> impl Iterator<Item = &'a T>
92 where
93 T: 'a,
94 {
95 self.array().as_slice()[0..=Self::Y_INDEX].iter()
96 }
97
98 fn iter_xy_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut T>
99 where
100 T: 'a,
101 {
102 self.array_mut().as_mut_slice()[0..=Self::Y_INDEX].iter_mut()
103 }
104}
105impl<T> HaveYAndOne<T> for Vector4<T>
106where
107 T: One + Zero,
108{
109 const Y: Self = Vector4::new(T::ZERO, T::ONE, T::ZERO, T::ZERO);
110}
111impl<T> HaveYAndMinusOne<T> for Vector4<T>
112where
113 T: MinusOne + Zero,
114{
115 const MINUS_Y: Self = Vector4::new(T::ZERO, T::MINUS_ONE, T::ZERO, T::ZERO);
116}
117
118impl<T> HaveZ<T> for Vector4<T>
119{
120 fn iter_xyz<'a>(&'a self) -> impl Iterator<Item = &'a T>
121 where
122 T: 'a,
123 {
124 self.array().as_slice()[0..=Self::Z_INDEX].iter()
125 }
126
127 fn iter_xyz_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut T>
128 where
129 T: 'a,
130 {
131 self.array_mut().as_mut_slice()[0..=Self::Z_INDEX].iter_mut()
132 }
133}
134impl<T> HaveZAndOne<T> for Vector4<T>
135where
136 T: One + Zero,
137{
138 const Z: Self = Vector4::new(T::ZERO, T::ZERO, T::ONE, T::ZERO);
139}
140impl<T> HaveZAndMinusOne<T> for Vector4<T>
141where
142 T: MinusOne + Zero,
143{
144 const MINUS_Z: Self = Vector4::new(T::ZERO, T::ZERO, T::MINUS_ONE, T::ZERO);
145}
146
147impl<T> HaveW<T> for Vector4<T>
148{
149 fn iter_xyzw<'a>(&'a self) -> impl Iterator<Item = &'a T>
150 where
151 T: 'a,
152 {
153 self.array().as_slice()[0..=Self::W_INDEX].iter()
154 }
155
156 fn iter_xyzw_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut T>
157 where
158 T: 'a,
159 {
160 self.array_mut().as_mut_slice()[0..=Self::W_INDEX].iter_mut()
161 }
162}
163impl<T> HaveWAndOne<T> for Vector4<T>
164where
165 T: One + Zero,
166{
167 const W: Self = Vector4::new(T::ZERO, T::ZERO, T::ZERO, T::ONE);
168}
169impl<T> HaveWAndMinusOne<T> for Vector4<T>
170where
171 T: MinusOne + Zero,
172{
173 const MINUS_W: Self = Vector4::new(T::ZERO, T::ZERO, T::ZERO, T::MINUS_ONE);
174}
175
176impl<T> From<Vector1<T>> for Vector4<T>
177where
178 T: Default,
179{
180 fn from(value: Vector1<T>) -> Self { value.resize() }
181}
182impl<T> From<Vector2<T>> for Vector4<T>
183where
184 T: Default,
185{
186 fn from(value: Vector2<T>) -> Self { value.resize() }
187}
188impl<T> From<Vector3<T>> for Vector4<T>
189where
190 T: Default,
191{
192 fn from(value: Vector3<T>) -> Self { value.resize() }
193}
194
195pub type Vector4Iter<T> = VectorIter<Vector4<T>, 4>;
196
197pub(crate) mod prelude
198{
199 pub use super::{Bool4, Point4, SplatCoord4, Vec4, Vector4, point4, vec4, vec4b, vector4};
200}