windows_numerics/
matrix4x4.rs

1use super::*;
2
3impl 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
154impl core::ops::Add<Matrix4x4> for Matrix4x4 {
155    type Output = Matrix4x4;
156    fn add(self, rhs: Matrix4x4) -> Matrix4x4 {
157        self.impl_add(&rhs)
158    }
159}
160impl core::ops::Add<&Matrix4x4> for Matrix4x4 {
161    type Output = Matrix4x4;
162    fn add(self, rhs: &Matrix4x4) -> Matrix4x4 {
163        self.impl_add(rhs)
164    }
165}
166impl core::ops::Add<Matrix4x4> for &Matrix4x4 {
167    type Output = Matrix4x4;
168    fn add(self, rhs: Matrix4x4) -> Matrix4x4 {
169        self.impl_add(&rhs)
170    }
171}
172impl core::ops::Add<&Matrix4x4> for &Matrix4x4 {
173    type Output = Matrix4x4;
174    fn add(self, rhs: &Matrix4x4) -> Matrix4x4 {
175        self.impl_add(rhs)
176    }
177}
178impl core::ops::Sub<Matrix4x4> for Matrix4x4 {
179    type Output = Matrix4x4;
180    fn sub(self, rhs: Matrix4x4) -> Matrix4x4 {
181        self.impl_sub(&rhs)
182    }
183}
184impl core::ops::Sub<&Matrix4x4> for Matrix4x4 {
185    type Output = Matrix4x4;
186    fn sub(self, rhs: &Matrix4x4) -> Matrix4x4 {
187        self.impl_sub(rhs)
188    }
189}
190impl core::ops::Sub<Matrix4x4> for &Matrix4x4 {
191    type Output = Matrix4x4;
192    fn sub(self, rhs: Matrix4x4) -> Matrix4x4 {
193        self.impl_sub(&rhs)
194    }
195}
196impl core::ops::Sub<&Matrix4x4> for &Matrix4x4 {
197    type Output = Matrix4x4;
198    fn sub(self, rhs: &Matrix4x4) -> Matrix4x4 {
199        self.impl_sub(rhs)
200    }
201}
202impl core::ops::Mul<Matrix4x4> for Matrix4x4 {
203    type Output = Matrix4x4;
204    fn mul(self, rhs: Matrix4x4) -> Matrix4x4 {
205        self.impl_mul(&rhs)
206    }
207}
208impl core::ops::Mul<&Matrix4x4> for Matrix4x4 {
209    type Output = Matrix4x4;
210    fn mul(self, rhs: &Matrix4x4) -> Matrix4x4 {
211        self.impl_mul(rhs)
212    }
213}
214impl core::ops::Mul<Matrix4x4> for &Matrix4x4 {
215    type Output = Matrix4x4;
216    fn mul(self, rhs: Matrix4x4) -> Matrix4x4 {
217        self.impl_mul(&rhs)
218    }
219}
220impl core::ops::Mul<&Matrix4x4> for &Matrix4x4 {
221    type Output = Matrix4x4;
222    fn mul(self, rhs: &Matrix4x4) -> Matrix4x4 {
223        self.impl_mul(rhs)
224    }
225}
226impl 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}
232impl 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}