hexga_math/geometry/vector/
vector2.rs1use super::*;
2
3#[repr(C)]
5pub struct CoordXY<T>
6{
7 pub x: T,
8 pub y: T,
9}
10impl<T> Deref for Vector<T, 2>
11{
12 type Target = CoordXY<T>;
13 fn deref(&self) -> &Self::Target { unsafe { std::mem::transmute(self) } }
14}
15impl<T> DerefMut for Vector<T, 2>
16{
17 fn deref_mut(&mut self) -> &mut Self::Target { unsafe { std::mem::transmute(self) } }
18}
19
20pub type Vector2<T> = Vector<T, 2>;
21
22impl<T> Vector<T, 2> {
24 pub const fn new(x: T, y: T) -> Self { Self::from_array([x, y]) }
25 pub fn with_z(self, z: T) -> Vector3<T>
26 {
27 let [x, y] = self.array;
28 Vector3::new(x, y, z)
29 }
30}
31
32pub trait SplatCoord2: Sized + Copy
33{
34 fn splat2(self) -> Vector2<Self> { Vector2::splat(self) }
35}
36impl<T: Copy> SplatCoord2 for T {}
37
38impl<T> From<(T, T)> for Vector2<T>
39{
40 fn from(value: (T, T)) -> Self { Vector2::new(value.0, value.1) }
41}
42impl<T> From<Vector2<T>> for (T, T)
43{
44 fn from(value: Vector2<T>) -> Self
45 {
46 let [x, y] = value.array;
47 (x, y)
48 }
49}
50
51pub const fn vector2<T>(x: T, y: T) -> Vector2<T> { Vector2::new(x, y) }
52
53pub type Bool2 = Bool<2>;
54pub const fn bool2(x: bool, y: bool) -> Bool2 { Bool2::new(x, y) }
55
56pub type Vec2 = Vector2<float>;
57pub const fn vec2(x: float, y: float) -> Vec2 { Vec2::new(x, y) }
58pub type Coef2 = Vec2;
59
60pub type Point2 = Point<2>;
61pub const fn point2(x: int, y: int) -> Point2 { Point2::new(x, y) }
62
63impl<T> HaveX<T> for Vector2<T>
64{
65 fn iter_x<'a>(&'a self) -> impl Iterator<Item = &'a T>
66 where
67 T: 'a,
68 {
69 self.array().as_slice()[0..=Self::X_INDEX].iter()
70 }
71
72 fn iter_x_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut T>
73 where
74 T: 'a,
75 {
76 self.array_mut().as_mut_slice()[0..=Self::X_INDEX].iter_mut()
77 }
78}
79impl<T> HaveXAndOne<T> for Vector2<T>
80where
81 T: One + Zero,
82{
83 const X: Self = Vector2::new(T::ONE, T::ZERO);
84}
85impl<T> HaveXAndMinusOne<T> for Vector2<T>
86where
87 T: MinusOne + Zero,
88{
89 const MINUS_X: Self = Vector2::new(T::MINUS_ONE, T::ZERO);
90}
91
92impl<T> HaveY<T> for Vector2<T>
93{
94 fn iter_xy<'a>(&'a self) -> impl Iterator<Item = &'a T>
95 where
96 T: 'a,
97 {
98 self.array().as_slice()[0..=Self::Y_INDEX].iter()
99 }
100
101 fn iter_xy_mut<'a>(&'a mut self) -> impl Iterator<Item = &'a mut T>
102 where
103 T: 'a,
104 {
105 self.array_mut().as_mut_slice()[0..=Self::Y_INDEX].iter_mut()
106 }
107}
108impl<T> HaveYAndOne<T> for Vector2<T>
109where
110 T: One + Zero,
111{
112 const Y: Self = Vector2::new(T::ZERO, T::ONE);
113}
114impl<T> HaveYAndMinusOne<T> for Vector2<T>
115where
116 T: MinusOne + Zero,
117{
118 const MINUS_Y: Self = Vector2::new(T::ZERO, T::MINUS_ONE);
119}
120
121impl<T> From<Vector1<T>> for Vector2<T>
122where
123 T: Default,
124{
125 fn from(value: Vector1<T>) -> Self { value.resize() }
126}
127impl<T> From<Vector3<T>> for Vector2<T>
128{
129 fn from(value: Vector3<T>) -> Self
130 {
131 let [x, y, ..] = value.to_array();
132 Self::new(x, y)
133 }
134}
135impl<T> From<Vector4<T>> for Vector2<T>
136{
137 fn from(value: Vector4<T>) -> Self
138 {
139 let [x, y, ..] = value.to_array();
140 Self::new(x, y)
141 }
142}
143
144pub type Vector2Iter<T> = VectorIter<Vector2<T>, 2>;
145
146pub(crate) mod prelude
147{
148 pub use super::{Bool2, Point2, SplatCoord2, Vec2, Vector2, bool2, point2, vec2, vector2};
149}