melius_vectors/
vector4.rs

1use std::{fmt::Display, ops::{Add, AddAssign, Sub, SubAssign, Mul, MulAssign, Div, DivAssign}};
2use crate::vector2::Vector2;
3use crate::vector3::Vector3;
4
5#[derive(Copy, Clone, Debug)]
6pub struct Vector4<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> {
7    pub x: T,
8    pub y: T,
9    pub z: T,
10    pub w: T,
11}
12
13impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Vector4<T> {
14    pub fn new(x: T, y: T, z: T, w: T) -> Self {
15        Self {
16            x,
17            y,
18            z,
19            w,
20        }
21    }
22
23    pub fn empty() -> Self {
24        Self {
25            x: Default::default(),
26            y: Default::default(),
27            z: Default::default(),
28            w: Default::default(),
29        }
30    }
31
32    pub fn from_vector2(vec2: Vector2<T>) -> Vector4<T> {
33        Vector4::new(vec2.x, vec2.y, Default::default(), Default::default())
34    }
35
36    pub fn from_vector3(vec3: Vector3<T>) -> Vector4<T> {
37        Vector4::new(vec3.x, vec3.y, vec3.z, Default::default())
38    }
39}
40
41impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Add for Vector4<T> {
42    type Output = Self;
43
44    fn add(self, rhs: Self) -> Self::Output {
45        Self {
46            x: self.x + rhs.x,
47            y: self.y + rhs.y,
48            z: self.z + rhs.z,
49            w: self.w + rhs.w,
50        }
51    }
52}
53
54impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> AddAssign for Vector4<T> {
55    fn add_assign(&mut self, rhs: Self) {
56        self.x += rhs.x;
57        self.y += rhs.y;
58        self.z += rhs.z;
59        self.w += rhs.w;
60    }
61}
62
63impl <T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Sub for Vector4<T> {
64    type Output = Self;
65
66    fn sub(self, rhs: Self) -> Self::Output {
67        Self {
68            x: self.x - rhs.x,
69            y: self.y - rhs.y,
70            z: self.z - rhs.z,
71            w: self.w - rhs.w,
72        }
73    }
74}
75
76impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> SubAssign for Vector4<T> {
77    fn sub_assign(&mut self, rhs: Self) {
78        self.x -= rhs.x;
79        self.y -= rhs.y;
80        self.z -= rhs.z;
81        self.w -= rhs.w;
82    }
83}
84
85impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Mul for Vector4<T> {
86    type Output = Self;
87
88    fn mul(self, rhs: Self) -> Self::Output {
89        Self {
90            x: self.x * rhs.x,
91            y: self.y * rhs.y,
92            z: self.z * rhs.z,
93            w: self.w * rhs.w,
94        }
95    }
96}
97
98impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> MulAssign for Vector4<T> {
99    fn mul_assign(&mut self, rhs: Self) {
100        self.x *= rhs.x;
101        self.y *= rhs.y;
102        self.z *= rhs.z;
103        self.w *= rhs.w;
104    }
105}
106
107impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Div for Vector4<T> {
108    type Output = Self;
109
110    fn div(self, rhs: Self) -> Self::Output {
111        Self {
112            x: self.x / rhs.x,
113            y: self.y / rhs.y,
114            z: self.z / rhs.z,
115            w: self.w / rhs.w,
116        }
117    }
118}
119
120impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> DivAssign for Vector4<T> {
121    fn div_assign(&mut self, rhs: Self) {
122        self.x /= rhs.x;
123        self.y /= rhs.y;
124        self.z /= rhs.z;
125        self.w /= rhs.w;
126    }
127}
128
129impl<T: Default + Display + Add<Output = T> + AddAssign + Sub<Output = T> + SubAssign + Mul<Output = T> + MulAssign + Div<Output = T> + DivAssign> Display for Vector4<T> {
130    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
131        write!(f, "{{{}, {}, {}, {}}}", self.x, self.y, self.z, self.w)
132    }
133}