melius_vectors/
vector3.rs

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