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}