hexga_math/geometry/vector/
vector2.rs

1use super::*;
2
3/// 2 dimensions: x, y
4#[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> // Hardcode N here otherwise rust-analyser will not like it
23{
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> { let [x, y] = self.array; Vector3::new(x, y, z) }
26}
27
28pub trait SplatCoord2 : Sized + Copy { fn splat2(self) -> Vector2<Self> { Vector2::splat(self) }}
29impl<T:Copy> SplatCoord2 for T {}
30
31impl<T> From<(T,T,)> for Vector2<T> { fn from(value: (T,T,)) -> Self { Vector2::new(value.0, value.1) }}
32impl<T> From<Vector2<T>> for (T,T,) { fn from(value: Vector2<T>) -> Self { let [x, y] = value.array; (x,y,) }}
33
34pub const fn vector2<T>(x: T, y: T) -> Vector2<T> { Vector2::new(x, y) }
35
36pub type Bool2 = Bool<2>;
37pub const fn bool2(x: bool, y: bool) -> Bool2 { Bool2::new(x, y) }
38
39pub type Vec2 = Vector2<float>;
40pub const fn vec2(x: float, y: float) -> Vec2 { Vec2::new(x, y) }
41pub type Coef2 = Vec2;
42
43pub type Point2 = Point<2>;
44pub const fn point2(x: int, y: int) -> Point2 { Point2::new(x, y) }
45
46impl<T> HaveX<T> for Vector2<T>
47{
48    fn iter_x<'a>(&'a self) -> impl Iterator<Item=&'a T> where T: 'a {
49        self.array().as_slice()[0..=Self::X_INDEX].iter()
50    }
51
52    fn iter_x_mut<'a>(&'a mut self) -> impl Iterator<Item=&'a mut T> where T: 'a {
53        self.array_mut().as_mut_slice()[0..=Self::X_INDEX].iter_mut()
54    }
55}
56impl<T> HaveXAndOne<T> for Vector2<T> where T: One + Zero { const X: Self = Vector2::new(T::ONE, T::ZERO); }
57impl<T> HaveXAndMinusOne<T> for Vector2<T> where T: MinusOne + Zero { const MINUS_X: Self = Vector2::new(T::MINUS_ONE, T::ZERO); }
58
59impl<T> HaveY<T> for Vector2<T>
60{
61    fn iter_xy<'a>(&'a self) -> impl Iterator<Item=&'a T> where T: 'a {
62        self.array().as_slice()[0..=Self::Y_INDEX].iter()
63    }
64
65    fn iter_xy_mut<'a>(&'a mut self) -> impl Iterator<Item=&'a mut T> where T: 'a {
66        self.array_mut().as_mut_slice()[0..=Self::Y_INDEX].iter_mut()
67    }
68}
69impl<T> HaveYAndOne<T> for Vector2<T> where T: One + Zero { const Y: Self = Vector2::new(T::ZERO, T::ONE); }
70impl<T> HaveYAndMinusOne<T> for Vector2<T> where T: MinusOne + Zero { const MINUS_Y: Self = Vector2::new(T::ZERO, T::MINUS_ONE); }
71
72
73impl<T> From<Vector1<T>> for Vector2<T> where T: Default { fn from(value: Vector1<T>) -> Self { value.resize() } }
74impl<T> From<Vector3<T>> for Vector2<T> { fn from(value: Vector3<T>) -> Self { let [x, y,..] = value.to_array(); Self::new(x, y) } }
75impl<T> From<Vector4<T>> for Vector2<T> { fn from(value: Vector4<T>) -> Self { let [x, y,..] = value.to_array(); Self::new(x, y) } }
76
77pub type Vector2Iter<T> = VectorIter<Vector2<T>, 2>;
78
79pub(crate) mod prelude
80{
81    pub use super::
82    {
83        SplatCoord2,
84        Vector2,vector2,
85        Vec2,vec2,
86        Bool2,bool2,
87        Point2,point2,
88    };
89}