graphics_rs/math/
vec3.rs

1#[derive(Clone, Copy)]
2pub struct Vec3<T: Sized + Copy> {
3    x: T,
4    y: T,
5    z: T,
6}
7
8impl<T: Sized + Copy> From<(T, T, T)> for Vec3<T> {
9    fn from(value: (T, T, T)) -> Self {
10        let (x, y, z) = value;
11        Vec3::new(x, y, z)
12    }
13}
14
15impl<T: Sized + Copy> Vec3<T> {
16    pub fn new(x: T, y: T, z: T) -> Self {
17        Self { x, y, z }
18    }
19
20    pub fn x(&self) -> T {
21        self.x
22    }
23
24    pub fn y(&self) -> T {
25        self.y
26    }
27
28    pub fn z(&self) -> T {
29        self.z
30    }
31
32    pub fn set_x(&mut self, x: T) {
33        self.x = x;
34    }
35
36    pub fn set_y(&mut self, y: T) {
37        self.y = y;
38    }
39
40    pub fn set_z(&mut self, z: T) {
41        self.z = z;
42    }
43
44    pub fn set(&mut self, x: T, y: T, z: T) {
45        self.x = x;
46        self.y = y;
47        self.z = z;
48    }
49}
50
51impl Vec3<i64> {
52    pub fn rotate_x(&self, degrees: f64) -> Vec3<i64> {
53        let cos = f64::cos(degrees.to_radians());
54        let sin = f64::sin(degrees.to_radians());
55
56        let y = (self.y as f64 * cos - self.z as f64 * sin) as i64;
57        let z = (self.y as f64 * sin + self.z as f64 * cos) as i64;
58
59        Vec3::<i64>::new(self.x, y, z)
60    }
61
62    pub fn rotate_y(&self, degrees: f64) -> Vec3<i64> {
63        let cos = f64::cos(degrees.to_radians());
64        let sin = f64::sin(degrees.to_radians());
65
66        let x = (self.x as f64 * cos - self.z as f64 * sin) as i64;
67        let z = (self.x as f64 * sin + self.z as f64 * cos) as i64;
68
69        Vec3::<i64>::new(x, self.y, z)
70    }
71
72    pub fn rotate_z(&self, degrees: f64) -> Vec3<i64> {
73        let cos = f64::cos(degrees.to_radians());
74        let sin = f64::sin(degrees.to_radians());
75
76        let x = (self.x as f64 * cos - self.y as f64 * sin) as i64;
77        let y = (self.x as f64 * sin + self.y as f64 * cos) as i64;
78
79        Vec3::<i64>::new(x, y, self.z)
80    }
81
82    pub fn rotate(&self, rotation: &Vec3<f64>) -> Vec3<i64> {
83        self.rotate_x(rotation.x)
84            .rotate_y(rotation.y)
85            .rotate_z(rotation.z)
86    }
87}
88
89impl Vec3<f64> {
90    pub fn magnitude(&self) -> f64 {
91        f64::sqrt(self.x.powf(2f64) + self.y.powf(2f64) + self.y.powf(2f64))
92    }
93}