1 | use super::*; |
2 | |
3 | impl Matrix4x4 { |
4 | pub const fn translation(x: f32, y: f32, z: f32) -> Self { |
5 | Self { |
6 | M11: 1.0, |
7 | M12: 0.0, |
8 | M13: 0.0, |
9 | M14: 0.0, |
10 | M21: 0.0, |
11 | M22: 1.0, |
12 | M23: 0.0, |
13 | M24: 0.0, |
14 | M31: 0.0, |
15 | M32: 0.0, |
16 | M33: 1.0, |
17 | M34: 0.0, |
18 | M41: x, |
19 | M42: y, |
20 | M43: z, |
21 | M44: 1.0, |
22 | } |
23 | } |
24 | pub fn rotation_y(degree: f32) -> Self { |
25 | windows_link::link!("d2d1.dll" "system" fn D2D1SinCos(angle: f32, sin: *mut f32, cos: *mut f32)); |
26 | let angle = degree * (3.141592654 / 180.0); |
27 | let mut sin = 0.0; |
28 | let mut cos = 0.0; |
29 | unsafe { |
30 | D2D1SinCos(angle, &mut sin, &mut cos); |
31 | } |
32 | Self { |
33 | M11: cos, |
34 | M12: 0.0, |
35 | M13: -sin, |
36 | M14: 0.0, |
37 | M21: 0.0, |
38 | M22: 1.0, |
39 | M23: 0.0, |
40 | M24: 0.0, |
41 | M31: sin, |
42 | M32: 0.0, |
43 | M33: cos, |
44 | M34: 0.0, |
45 | M41: 0.0, |
46 | M42: 0.0, |
47 | M43: 0.0, |
48 | M44: 1.0, |
49 | } |
50 | } |
51 | pub fn perspective_projection(depth: f32) -> Self { |
52 | let projection = if depth > 0.0 { -1.0 / depth } else { 0.0 }; |
53 | Self { |
54 | M11: 1.0, |
55 | M12: 0.0, |
56 | M13: 0.0, |
57 | M14: 0.0, |
58 | M21: 0.0, |
59 | M22: 1.0, |
60 | M23: 0.0, |
61 | M24: 0.0, |
62 | M31: 0.0, |
63 | M32: 0.0, |
64 | M33: 1.0, |
65 | M34: projection, |
66 | M41: 0.0, |
67 | M42: 0.0, |
68 | M43: 0.0, |
69 | M44: 1.0, |
70 | } |
71 | } |
72 | fn impl_add(&self, rhs: &Self) -> Self { |
73 | Self { |
74 | M11: self.M11 + rhs.M11, |
75 | M12: self.M12 + rhs.M12, |
76 | M13: self.M13 + rhs.M13, |
77 | M14: self.M14 + rhs.M14, |
78 | M21: self.M21 + rhs.M21, |
79 | M22: self.M22 + rhs.M22, |
80 | M23: self.M23 + rhs.M23, |
81 | M24: self.M24 + rhs.M24, |
82 | M31: self.M31 + rhs.M31, |
83 | M32: self.M32 + rhs.M32, |
84 | M33: self.M33 + rhs.M33, |
85 | M34: self.M34 + rhs.M34, |
86 | M41: self.M41 + rhs.M41, |
87 | M42: self.M42 + rhs.M42, |
88 | M43: self.M43 + rhs.M43, |
89 | M44: self.M44 + rhs.M44, |
90 | } |
91 | } |
92 | fn impl_sub(&self, rhs: &Self) -> Self { |
93 | Self { |
94 | M11: self.M11 - rhs.M11, |
95 | M12: self.M12 - rhs.M12, |
96 | M13: self.M13 - rhs.M13, |
97 | M14: self.M14 - rhs.M14, |
98 | M21: self.M21 - rhs.M21, |
99 | M22: self.M22 - rhs.M22, |
100 | M23: self.M23 - rhs.M23, |
101 | M24: self.M24 - rhs.M24, |
102 | M31: self.M31 - rhs.M31, |
103 | M32: self.M32 - rhs.M32, |
104 | M33: self.M33 - rhs.M33, |
105 | M34: self.M34 - rhs.M34, |
106 | M41: self.M41 - rhs.M41, |
107 | M42: self.M42 - rhs.M42, |
108 | M43: self.M43 - rhs.M43, |
109 | M44: self.M44 - rhs.M44, |
110 | } |
111 | } |
112 | fn impl_mul(&self, rhs: &Self) -> Self { |
113 | Self { |
114 | M11: self.M11 * rhs.M11 + self.M12 * rhs.M21 + self.M13 * rhs.M31 + self.M14 * rhs.M41, |
115 | M12: self.M11 * rhs.M12 + self.M12 * rhs.M22 + self.M13 * rhs.M32 + self.M14 * rhs.M42, |
116 | M13: self.M11 * rhs.M13 + self.M12 * rhs.M23 + self.M13 * rhs.M33 + self.M14 * rhs.M43, |
117 | M14: self.M11 * rhs.M14 + self.M12 * rhs.M24 + self.M13 * rhs.M34 + self.M14 * rhs.M44, |
118 | M21: self.M21 * rhs.M11 + self.M22 * rhs.M21 + self.M23 * rhs.M31 + self.M24 * rhs.M41, |
119 | M22: self.M21 * rhs.M12 + self.M22 * rhs.M22 + self.M23 * rhs.M32 + self.M24 * rhs.M42, |
120 | M23: self.M21 * rhs.M13 + self.M22 * rhs.M23 + self.M23 * rhs.M33 + self.M24 * rhs.M43, |
121 | M24: self.M21 * rhs.M14 + self.M22 * rhs.M24 + self.M23 * rhs.M34 + self.M24 * rhs.M44, |
122 | M31: self.M31 * rhs.M11 + self.M32 * rhs.M21 + self.M33 * rhs.M31 + self.M34 * rhs.M41, |
123 | M32: self.M31 * rhs.M12 + self.M32 * rhs.M22 + self.M33 * rhs.M32 + self.M34 * rhs.M42, |
124 | M33: self.M31 * rhs.M13 + self.M32 * rhs.M23 + self.M33 * rhs.M33 + self.M34 * rhs.M43, |
125 | M34: self.M31 * rhs.M14 + self.M32 * rhs.M24 + self.M33 * rhs.M34 + self.M34 * rhs.M44, |
126 | M41: self.M41 * rhs.M11 + self.M42 * rhs.M21 + self.M43 * rhs.M31 + self.M44 * rhs.M41, |
127 | M42: self.M41 * rhs.M12 + self.M42 * rhs.M22 + self.M43 * rhs.M32 + self.M44 * rhs.M42, |
128 | M43: self.M41 * rhs.M13 + self.M42 * rhs.M23 + self.M43 * rhs.M33 + self.M44 * rhs.M43, |
129 | M44: self.M41 * rhs.M14 + self.M42 * rhs.M24 + self.M43 * rhs.M34 + self.M44 * rhs.M44, |
130 | } |
131 | } |
132 | fn impl_mul_f32(&self, rhs: f32) -> Self { |
133 | Self { |
134 | M11: self.M11 * rhs, |
135 | M12: self.M12 * rhs, |
136 | M13: self.M13 * rhs, |
137 | M14: self.M14 * rhs, |
138 | M21: self.M21 * rhs, |
139 | M22: self.M22 * rhs, |
140 | M23: self.M23 * rhs, |
141 | M24: self.M24 * rhs, |
142 | M31: self.M31 * rhs, |
143 | M32: self.M32 * rhs, |
144 | M33: self.M33 * rhs, |
145 | M34: self.M34 * rhs, |
146 | M41: self.M41 * rhs, |
147 | M42: self.M42 * rhs, |
148 | M43: self.M43 * rhs, |
149 | M44: self.M44 * rhs, |
150 | } |
151 | } |
152 | } |
153 | |
154 | impl core::ops::Add<Matrix4x4> for Matrix4x4 { |
155 | type Output = Matrix4x4; |
156 | fn add(self, rhs: Matrix4x4) -> Matrix4x4 { |
157 | self.impl_add(&rhs) |
158 | } |
159 | } |
160 | impl core::ops::Add<&Matrix4x4> for Matrix4x4 { |
161 | type Output = Matrix4x4; |
162 | fn add(self, rhs: &Matrix4x4) -> Matrix4x4 { |
163 | self.impl_add(rhs) |
164 | } |
165 | } |
166 | impl core::ops::Add<Matrix4x4> for &Matrix4x4 { |
167 | type Output = Matrix4x4; |
168 | fn add(self, rhs: Matrix4x4) -> Matrix4x4 { |
169 | self.impl_add(&rhs) |
170 | } |
171 | } |
172 | impl core::ops::Add<&Matrix4x4> for &Matrix4x4 { |
173 | type Output = Matrix4x4; |
174 | fn add(self, rhs: &Matrix4x4) -> Matrix4x4 { |
175 | self.impl_add(rhs) |
176 | } |
177 | } |
178 | impl core::ops::Sub<Matrix4x4> for Matrix4x4 { |
179 | type Output = Matrix4x4; |
180 | fn sub(self, rhs: Matrix4x4) -> Matrix4x4 { |
181 | self.impl_sub(&rhs) |
182 | } |
183 | } |
184 | impl core::ops::Sub<&Matrix4x4> for Matrix4x4 { |
185 | type Output = Matrix4x4; |
186 | fn sub(self, rhs: &Matrix4x4) -> Matrix4x4 { |
187 | self.impl_sub(rhs) |
188 | } |
189 | } |
190 | impl core::ops::Sub<Matrix4x4> for &Matrix4x4 { |
191 | type Output = Matrix4x4; |
192 | fn sub(self, rhs: Matrix4x4) -> Matrix4x4 { |
193 | self.impl_sub(&rhs) |
194 | } |
195 | } |
196 | impl core::ops::Sub<&Matrix4x4> for &Matrix4x4 { |
197 | type Output = Matrix4x4; |
198 | fn sub(self, rhs: &Matrix4x4) -> Matrix4x4 { |
199 | self.impl_sub(rhs) |
200 | } |
201 | } |
202 | impl core::ops::Mul<Matrix4x4> for Matrix4x4 { |
203 | type Output = Matrix4x4; |
204 | fn mul(self, rhs: Matrix4x4) -> Matrix4x4 { |
205 | self.impl_mul(&rhs) |
206 | } |
207 | } |
208 | impl core::ops::Mul<&Matrix4x4> for Matrix4x4 { |
209 | type Output = Matrix4x4; |
210 | fn mul(self, rhs: &Matrix4x4) -> Matrix4x4 { |
211 | self.impl_mul(rhs) |
212 | } |
213 | } |
214 | impl core::ops::Mul<Matrix4x4> for &Matrix4x4 { |
215 | type Output = Matrix4x4; |
216 | fn mul(self, rhs: Matrix4x4) -> Matrix4x4 { |
217 | self.impl_mul(&rhs) |
218 | } |
219 | } |
220 | impl core::ops::Mul<&Matrix4x4> for &Matrix4x4 { |
221 | type Output = Matrix4x4; |
222 | fn mul(self, rhs: &Matrix4x4) -> Matrix4x4 { |
223 | self.impl_mul(rhs) |
224 | } |
225 | } |
226 | impl core::ops::Mul<f32> for Matrix4x4 { |
227 | type Output = Matrix4x4; |
228 | fn mul(self, rhs: f32) -> Matrix4x4 { |
229 | self.impl_mul_f32(rhs) |
230 | } |
231 | } |
232 | impl core::ops::Mul<f32> for &Matrix4x4 { |
233 | type Output = Matrix4x4; |
234 | fn mul(self, rhs: f32) -> Matrix4x4 { |
235 | self.impl_mul_f32(rhs) |
236 | } |
237 | } |
238 | |