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}