annotate utils/src/math.rs @ 791:a29122662cde

utils: Simplify translate_2d and align Mat4 to 16 bytes This lowers the amount of instructions from 61 to 32 on PowerPC with AltiVec, and from 25 to 14 on amd64 with AVX2.
author Link Mauve <linkmauve@linkmauve.fr>
date Sat, 17 Jan 2026 14:19:58 +0100
parents d005f5927447
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }