Mercurial > touhou
annotate utils/src/math.rs @ 792:11bc22bad1bf default tip
python: Replace the image crate with png
We weren’t using any of its features anyway, so the png crate is exactly what
we need, without the many heavy dependencies of image.
https://github.com/image-rs/image-png/pull/670 will eventually make it even
faster to build.
| author | Link Mauve <linkmauve@linkmauve.fr> |
|---|---|
| date | Sat, 17 Jan 2026 22:22:25 +0100 |
| parents | a29122662cde |
| children |
| rev | line source |
|---|---|
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
1 //! Various helpers to deal with vectors and matrices. |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
2 |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
3 use const_for::const_for; |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
4 |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
5 /// A 4×4 f32 matrix type. |
|
791
a29122662cde
utils: Simplify translate_2d and align Mat4 to 16 bytes
Link Mauve <linkmauve@linkmauve.fr>
parents:
790
diff
changeset
|
6 #[repr(align(16))] |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
7 pub struct Mat4 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
8 inner: [[f32; 4]; 4] |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
9 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
10 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
11 impl Mat4 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
12 /// Create a new matrix from a set of 16 f32. |
|
789
b5bca9274335
utils: Make some math functions const
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
13 pub const fn new(inner: [[f32; 4]; 4]) -> Mat4 { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
14 Mat4 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
15 inner |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
16 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
17 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
18 |
|
789
b5bca9274335
utils: Make some math functions const
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
19 const fn zero() -> Mat4 { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
20 Mat4 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
21 inner: [[0.; 4]; 4] |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
22 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
23 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
24 |
|
789
b5bca9274335
utils: Make some math functions const
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
25 const fn identity() -> Mat4 { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
26 Mat4 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
27 inner: [[1., 0., 0., 0.], |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
28 [0., 1., 0., 0.], |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
29 [0., 0., 1., 0.], |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
30 [0., 0., 0., 1.]] |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
31 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
32 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
33 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
34 /// Immutably borrow the array of f32 inside this matrix. |
|
789
b5bca9274335
utils: Make some math functions const
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
35 pub const fn borrow_inner(&self) -> &[[f32; 4]; 4] { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
36 &self.inner |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
37 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
38 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
39 /// Scale the matrix in 2D. |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
40 pub const fn scale2d(&mut self, x: f32, y: f32) { |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
41 const_for!(i in 0..4 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
42 self.inner[0][i] *= x; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
43 self.inner[1][i] *= y; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
44 }); |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
45 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
46 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
47 /// Flip the matrix. |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
48 pub const fn flip(&mut self) { |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
49 const_for!(i in 0..4 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
50 self.inner[0][i] = -self.inner[0][i]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
51 }); |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
52 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
53 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
54 /// Rotate the matrix around its x angle (in radians). |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
55 pub fn rotate_x(&mut self, angle: f32) { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
56 let mut lines: [f32; 8] = [0.; 8]; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
57 let cos_a = angle.cos(); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
58 let sin_a = angle.sin(); |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
59 const_for!(i in 0..4 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
60 lines[ i] = self.inner[0][i]; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
61 lines[4 + i] = self.inner[1][i]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
62 }); |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
63 const_for!(i in 0..4 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
64 self.inner[1][i] = cos_a * lines[i] - sin_a * lines[4+i]; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
65 self.inner[2][i] = sin_a * lines[i] + cos_a * lines[4+i]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
66 }); |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
67 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
68 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
69 /// Rotate the matrix around its y angle (in radians). |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
70 pub fn rotate_y(&mut self, angle: f32) { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
71 let mut lines: [f32; 8] = [0.; 8]; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
72 let cos_a = angle.cos(); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
73 let sin_a = angle.sin(); |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
74 const_for!(i in 0..4 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
75 lines[ i] = self.inner[0][i]; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
76 lines[4 + i] = self.inner[2][i]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
77 }); |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
78 const_for!(i in 0..4 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
79 self.inner[0][i] = cos_a * lines[i] + sin_a * lines[4+i]; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
80 self.inner[2][i] = -sin_a * lines[i] + cos_a * lines[4+i]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
81 }); |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
82 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
83 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
84 /// Rotate the matrix around its z angle (in radians). |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
85 pub fn rotate_z(&mut self, angle: f32) { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
86 let mut lines: [f32; 8] = [0.; 8]; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
87 let cos_a = angle.cos(); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
88 let sin_a = angle.sin(); |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
89 const_for!(i in 0..4 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
90 lines[ i] = self.inner[0][i]; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
91 lines[4 + i] = self.inner[1][i]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
92 }); |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
93 const_for!(i in 0..4 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
94 self.inner[0][i] = cos_a * lines[i] - sin_a * lines[4+i]; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
95 self.inner[1][i] = sin_a * lines[i] + cos_a * lines[4+i]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
96 }); |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
97 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
98 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
99 /// Translate the matrix by a 3D offset. |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
100 pub const fn translate(&mut self, offset: [f32; 3]) { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
101 let mut item: [f32; 3] = [0.; 3]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
102 const_for!(i in 0..3 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
103 item[i] = self.inner[3][i] * offset[i]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
104 }); |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
105 const_for!(i in 0..3 => { |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
106 const_for!(j in 0..4 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
107 self.inner[i][j] += item[i]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
108 }); |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
109 }); |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
110 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
111 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
112 /// Translate the matrix by a 2D offset. |
|
791
a29122662cde
utils: Simplify translate_2d and align Mat4 to 16 bytes
Link Mauve <linkmauve@linkmauve.fr>
parents:
790
diff
changeset
|
113 pub const fn translate_2d(&mut self, mut x: f32, mut y: f32) { |
|
a29122662cde
utils: Simplify translate_2d and align Mat4 to 16 bytes
Link Mauve <linkmauve@linkmauve.fr>
parents:
790
diff
changeset
|
114 x *= self.inner[3][0]; |
|
a29122662cde
utils: Simplify translate_2d and align Mat4 to 16 bytes
Link Mauve <linkmauve@linkmauve.fr>
parents:
790
diff
changeset
|
115 y *= self.inner[3][1]; |
|
a29122662cde
utils: Simplify translate_2d and align Mat4 to 16 bytes
Link Mauve <linkmauve@linkmauve.fr>
parents:
790
diff
changeset
|
116 const_for!(i in 0..4 => { |
|
a29122662cde
utils: Simplify translate_2d and align Mat4 to 16 bytes
Link Mauve <linkmauve@linkmauve.fr>
parents:
790
diff
changeset
|
117 self.inner[0][i] += x; |
|
a29122662cde
utils: Simplify translate_2d and align Mat4 to 16 bytes
Link Mauve <linkmauve@linkmauve.fr>
parents:
790
diff
changeset
|
118 self.inner[1][i] += y; |
|
a29122662cde
utils: Simplify translate_2d and align Mat4 to 16 bytes
Link Mauve <linkmauve@linkmauve.fr>
parents:
790
diff
changeset
|
119 }); |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
120 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
121 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
122 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
123 impl std::ops::Mul<Mat4> for Mat4 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
124 type Output = Mat4; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
125 fn mul(self, rhs: Mat4) -> Mat4 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
126 let mut tmp = Mat4::zero(); |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
127 const_for!(i in 0..4 => { |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
128 const_for!(j in 0..4 => { |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
129 const_for!(k in 0..4 => { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
130 tmp.inner[i][j] += self.inner[i][k] * rhs.inner[k][j]; |
|
790
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
131 }); |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
132 }); |
|
d005f5927447
utils: Use const_for to make more const fn
Link Mauve <linkmauve@linkmauve.fr>
parents:
789
diff
changeset
|
133 }); |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
134 tmp |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
135 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
136 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
137 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
138 /// Create an orthographic projection matrix. |
|
789
b5bca9274335
utils: Make some math functions const
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
139 pub const fn ortho_2d(left: f32, right: f32, bottom: f32, top: f32) -> Mat4 { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
140 let mut mat = Mat4::identity(); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
141 mat.inner[0][0] = 2. / (right - left); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
142 mat.inner[1][1] = 2. / (top - bottom); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
143 mat.inner[2][2] = -1.; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
144 mat.inner[3][0] = -(right + left) / (right - left); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
145 mat.inner[3][1] = -(top + bottom) / (top - bottom); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
146 mat |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
147 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
148 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
149 /// Setup a camera view matrix. |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
150 pub fn setup_camera(dx: f32, dy: f32, dz: f32) -> Mat4 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
151 // Some explanations on the magic constants: |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
152 // 192. = 384. / 2. = width / 2. |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
153 // 224. = 448. / 2. = height / 2. |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
154 // 835.979370 = 224./math.tan(math.radians(15)) = (height/2.)/math.tan(math.radians(fov/2)) |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
155 // This is so that objects on the (O, x, y) plane use pixel coordinates |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
156 look_at([192., 224., -835.979370 * dz], [192. + dx, 224. - dy, 0.], [0., -1., 0.]) |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
157 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
158 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
159 /// Creates a perspective projection matrix. |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
160 pub fn perspective(fov_y: f32, aspect: f32, z_near: f32, z_far: f32) -> Mat4 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
161 let top = (fov_y / 2.).tan() * z_near; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
162 let bottom = -top; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
163 let left = -top * aspect; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
164 let right = top * aspect; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
165 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
166 let mut mat = Mat4::identity(); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
167 mat.inner[0][0] = (2. * z_near) / (right - left); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
168 mat.inner[1][1] = (2. * z_near) / (top - bottom); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
169 mat.inner[2][2] = -(z_far + z_near) / (z_far - z_near); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
170 mat.inner[2][3] = -1.; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
171 mat.inner[3][2] = -(2. * z_far * z_near) / (z_far - z_near); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
172 mat.inner[3][3] = 0.; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
173 mat |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
174 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
175 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
176 type Vec3 = [f32; 3]; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
177 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
178 fn look_at(eye: Vec3, center: Vec3, up: Vec3) -> Mat4 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
179 let f = normalize(sub(center, eye)); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
180 let u = normalize(up); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
181 let s = normalize(cross(f, u)); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
182 let u = cross(s, f); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
183 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
184 Mat4::new([[s[0], u[0], -f[0], 0.], |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
185 [s[1], u[1], -f[1], 0.], |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
186 [s[2], u[2], -f[2], 0.], |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
187 [-dot(s, eye), -dot(u, eye), dot(f, eye), 1.]]) |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
188 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
189 |
|
789
b5bca9274335
utils: Make some math functions const
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
190 const fn sub(a: Vec3, b: Vec3) -> Vec3 { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
191 [a[0] - b[0], |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
192 a[1] - b[1], |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
193 a[2] - b[2]] |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
194 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
195 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
196 fn normalize(vec: Vec3) -> Vec3 { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
197 let normal = 1. / (vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]).sqrt(); |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
198 [vec[0] * normal, vec[1] * normal, vec[2] * normal] |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
199 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
200 |
|
789
b5bca9274335
utils: Make some math functions const
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
201 const fn cross(a: Vec3, b: Vec3) -> Vec3 { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
202 [a[1] * b[2] - b[1] * a[2], |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
203 a[2] * b[0] - b[2] * a[0], |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
204 a[0] * b[1] - b[0] * a[1]] |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
205 } |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
206 |
|
789
b5bca9274335
utils: Make some math functions const
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
207 const fn dot(a: Vec3, b: Vec3) -> f32 { |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
208 a[0] * b[0] + a[1] * b[1] + a[2] * b[2] |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
209 } |
