1use crate::{F32Fmt, SignOps, Two};
2
3use {
4 super::{
5 SqMatrix,
6 vector4::Vector4,
7 },
8 crate::{
9 Construct,
10 One, Zero
11 },
12 std::{
13 fmt,
14 ops::{Add, Mul, Sub, Div, Rem, Neg}
15 },
16};
17
18#[derive(PartialEq, Clone, Copy)]
20pub struct Matrix4<T>{pub m:[[T; 4]; 4]}
21
22impl<T> Matrix4<T> {
23 pub fn new(
31 row0: [T; 4],
32 row1: [T; 4],
33 row2: [T; 4],
34 row3: [T; 4]) -> Self {
35 Matrix4 {
36 m: [
37 row0,
38 row1,
39 row2,
40 row3
41 ]
42 }
43 }
44
45 #[allow(clippy::too_many_arguments)]
46 pub fn new_val(
47 r0c0: T, r0c1: T, r0c2: T, r0c3: T,
48 r1c0: T, r1c1: T, r1c2: T, r1c3: T,
49 r2c0: T, r2c1: T, r2c2: T, r2c3: T,
50 r3c0: T, r3c1: T, r3c2: T, r3c3: T) -> Self {
51 Matrix4 {
52 m: [
53 [r0c0, r0c1, r0c2, r0c3],
54 [r1c0, r1c1, r1c2, r1c3],
55 [r2c0, r2c1, r2c2, r2c3],
56 [r3c0, r3c1, r3c2, r3c3]
57 ]
58 }
59 }
60
61 pub fn identity() -> Self
63 where T: Zero + One {
64 Self::ONE
65 }
66
67 #[allow(dead_code)]
68 pub fn determinant(&self) -> T
69 where T: Add<T, Output = T> + Mul<T, Output = T> + Sub<T, Output = T> + Copy {
70 self.m[0][0] * (
71 (self.m[1][1] * self.m[2][2] * self.m[3][3]) +
72 (self.m[1][2] * self.m[2][3] * self.m[3][1]) +
73 (self.m[1][3] * self.m[2][1] * self.m[3][2])
74 - (self.m[1][3] * self.m[2][2] * self.m[3][1])
75 - (self.m[1][2] * self.m[2][1] * self.m[3][3])
76 - (self.m[1][1] * self.m[2][3] * self.m[3][2])
77 ) - self.m[1][0] * (
78 (self.m[0][1] * self.m[2][2] * self.m[3][3]) +
79 (self.m[0][2] * self.m[2][3] * self.m[3][1]) +
80 (self.m[0][3] * self.m[2][1] * self.m[3][2])
81 - (self.m[0][3] * self.m[2][2] * self.m[3][1])
82 - (self.m[0][2] * self.m[2][1] * self.m[3][3])
83 - (self.m[0][1] * self.m[2][3] * self.m[3][2])
84 ) + self.m[2][0] * (
85 (self.m[0][1] * self.m[1][2] * self.m[3][3]) +
86 (self.m[0][2] * self.m[1][3] * self.m[3][1]) +
87 (self.m[0][3] * self.m[1][1] * self.m[3][2])
88 - (self.m[0][3] * self.m[1][2] * self.m[3][1])
89 - (self.m[0][2] * self.m[1][1] * self.m[3][3])
90 - (self.m[0][1] * self.m[1][3] * self.m[3][2])
91 ) - self.m[3][0] * (
92 (self.m[0][1] * self.m[1][2] * self.m[2][3]) +
93 (self.m[0][2] * self.m[1][3] * self.m[2][1]) +
94 (self.m[0][3] * self.m[1][1] * self.m[2][2])
95 - (self.m[0][3] * self.m[1][2] * self.m[2][1])
96 - (self.m[0][2] * self.m[1][1] * self.m[2][3])
97 - (self.m[0][1] * self.m[1][3] * self.m[2][2])
98 )
99 }
100
101 pub fn transpose(&self) -> Matrix4<T>
111 where T: Copy {
112 Matrix4 {
113 m: [
114 [self.m[0][0], self.m[1][0], self.m[2][0], self.m[3][0]],
115 [self.m[0][1], self.m[1][1], self.m[2][1], self.m[3][1]],
116 [self.m[0][2], self.m[1][2], self.m[2][2], self.m[3][2]],
117 [self.m[0][3], self.m[1][3], self.m[2][3], self.m[3][3]]
118 ]
119 }
120 }
121
122 #[allow(clippy::possible_missing_comma)]
123 pub fn cofactor(self) -> Self
124 where T: Mul<T, Output = T> + Neg<Output = T> + Add<T, Output = T> + Sub<T, Output = T> + Copy {
125 Matrix4 {
126 m: [
127 [
128 (self.m[1][1] * self.m[2][2] * self.m[3][3]) +
129 (self.m[2][1] * self.m[3][2] * self.m[1][3]) +
130 (self.m[3][1] * self.m[1][2] * self.m[2][3])
131 - (self.m[3][1] * self.m[2][2] * self.m[1][3])
132 - (self.m[2][1] * self.m[1][2] * self.m[3][3])
133 - (self.m[1][1] * self.m[3][2] * self.m[2][3]),
134
135 - (self.m[1][0] * self.m[2][2] * self.m[3][3])
136 - (self.m[2][0] * self.m[3][2] * self.m[1][3])
137 - (self.m[3][0] * self.m[1][2] * self.m[2][3]) +
138 (self.m[3][0] * self.m[2][2] * self.m[1][3]) +
139 (self.m[2][0] * self.m[1][2] * self.m[3][3]) +
140 (self.m[1][0] * self.m[3][2] * self.m[2][3]),
141
142 (self.m[1][0] * self.m[2][1] * self.m[3][3]) +
143 (self.m[2][0] * self.m[3][1] * self.m[1][3]) +
144 (self.m[3][0] * self.m[1][1] * self.m[2][3])
145 - (self.m[3][0] * self.m[2][1] * self.m[1][3])
146 - (self.m[2][0] * self.m[1][1] * self.m[3][3])
147 - (self.m[1][0] * self.m[3][1] * self.m[2][3]),
148
149 - (self.m[1][0] * self.m[2][1] * self.m[3][2])
150 - (self.m[2][0] * self.m[3][1] * self.m[1][2])
151 - (self.m[3][0] * self.m[1][1] * self.m[2][2]) +
152 (self.m[3][0] * self.m[2][1] * self.m[1][2]) +
153 (self.m[2][0] * self.m[1][1] * self.m[3][2]) +
154 (self.m[1][0] * self.m[3][1] * self.m[2][2])
155 ],
156 [
157 - (self.m[0][1] * self.m[2][2] * self.m[3][3])
158 - (self.m[2][1] * self.m[3][2] * self.m[0][3])
159 - (self.m[3][1] * self.m[0][2] * self.m[2][3]) +
160 (self.m[3][1] * self.m[2][2] * self.m[0][3]) +
161 (self.m[2][1] * self.m[0][2] * self.m[3][3]) +
162 (self.m[0][1] * self.m[3][2] * self.m[2][3]),
163
164 (self.m[0][0] * self.m[2][2] * self.m[3][3]) +
165 (self.m[2][0] * self.m[3][2] * self.m[0][3]) +
166 (self.m[3][0] * self.m[0][2] * self.m[2][3])
167 - (self.m[3][0] * self.m[2][2] * self.m[0][3])
168 - (self.m[2][0] * self.m[0][2] * self.m[3][3])
169 - (self.m[0][0] * self.m[3][2] * self.m[2][3]),
170
171 - (self.m[0][0] * self.m[2][1] * self.m[3][3]) - (self.m[2][0] * self.m[3][1] * self.m[0][3])
173 - (self.m[3][0] * self.m[0][1] * self.m[2][3]) +
174 (self.m[3][0] * self.m[2][1] * self.m[0][3]) +
175 (self.m[2][0] * self.m[0][1] * self.m[3][3]) +
176 (self.m[0][0] * self.m[3][1] * self.m[2][3]), (self.m[0][0] * self.m[2][1] * self.m[3][2]) +
179 (self.m[2][0] * self.m[3][1] * self.m[0][2]) +
180 (self.m[3][0] * self.m[0][1] * self.m[2][2])
181 - (self.m[3][0] * self.m[2][1] * self.m[0][2])
182 - (self.m[2][0] * self.m[0][1] * self.m[3][2])
183 - (self.m[0][0] * self.m[3][1] * self.m[2][2])
184 ],
185 [
186 (self.m[0][1] * self.m[1][2] * self.m[3][3]) +
187 (self.m[1][1] * self.m[3][2] * self.m[0][3]) +
188 (self.m[3][1] * self.m[0][2] * self.m[1][3])
189 - (self.m[3][1] * self.m[1][2] * self.m[0][3])
190 - (self.m[1][1] * self.m[0][2] * self.m[3][3])
191 - (self.m[0][1] * self.m[3][2] * self.m[1][3]),
192
193 - (self.m[0][0] * self.m[1][2] * self.m[3][3])
194 - (self.m[1][0] * self.m[3][2] * self.m[0][3])
195 - (self.m[3][0] * self.m[0][2] * self.m[1][3]) +
196 (self.m[3][0] * self.m[1][2] * self.m[0][3]) +
197 (self.m[1][0] * self.m[0][2] * self.m[3][3]) +
198 (self.m[0][0] * self.m[3][2] * self.m[1][3]),
199
200 (self.m[0][0] * self.m[1][1] * self.m[3][3]) +
201 (self.m[1][0] * self.m[3][1] * self.m[0][3]) +
202 (self.m[3][0] * self.m[0][1] * self.m[1][3])
203 - (self.m[3][0] * self.m[1][1] * self.m[0][3])
204 - (self.m[1][0] * self.m[0][1] * self.m[3][3])
205 - (self.m[0][0] * self.m[3][1] * self.m[1][3]),
206
207 - (self.m[0][0] * self.m[1][1] * self.m[3][2])
208 - (self.m[1][0] * self.m[3][1] * self.m[0][2])
209 - (self.m[3][0] * self.m[0][1] * self.m[1][2]) +
210 (self.m[3][0] * self.m[1][1] * self.m[0][2]) +
211 (self.m[1][0] * self.m[0][1] * self.m[3][2]) +
212 (self.m[0][0] * self.m[3][1] * self.m[1][2])
213 ],
214 [
215 - (self.m[0][1] * self.m[1][2] * self.m[2][3])
216 - (self.m[1][1] * self.m[2][2] * self.m[0][3])
217 - (self.m[2][1] * self.m[0][2] * self.m[1][3]) +
218 (self.m[2][1] * self.m[1][2] * self.m[0][3]) +
219 (self.m[1][1] * self.m[0][2] * self.m[2][3]) +
220 (self.m[0][1] * self.m[2][2] * self.m[1][3]),
221
222 (self.m[0][0] * self.m[1][2] * self.m[2][3]) +
223 (self.m[1][0] * self.m[2][2] * self.m[0][3]) +
224 (self.m[2][0] * self.m[0][2] * self.m[1][3])
225 - (self.m[2][0] * self.m[1][2] * self.m[0][3])
226 - (self.m[1][0] * self.m[0][2] * self.m[2][3])
227 - (self.m[0][0] * self.m[2][2] * self.m[1][3]),
228
229 - (self.m[0][0] * self.m[1][1] * self.m[2][3])
230 - (self.m[1][0] * self.m[2][1] * self.m[0][3])
231 - (self.m[2][0] * self.m[0][1] * self.m[1][3]) +
232 (self.m[2][0] * self.m[1][1] * self.m[0][3]) +
233 (self.m[1][0] * self.m[0][1] * self.m[2][3]) +
234 (self.m[0][0] * self.m[2][1] * self.m[1][3]),
235
236 (self.m[0][0] * self.m[1][1] * self.m[2][2]) +
237 (self.m[1][0] * self.m[2][1] * self.m[0][2]) +
238 (self.m[2][0] * self.m[0][1] * self.m[1][2])
239 - (self.m[2][0] * self.m[1][1] * self.m[0][2])
240 - (self.m[1][0] * self.m[0][1] * self.m[2][2])
241 - (self.m[0][0] * self.m[2][1] * self.m[1][2])
242 ]
243 ],
244 }
245 }
246
247 pub fn adjugate(self) -> Self
249 where T: Mul<T, Output = T> + Neg<Output = T> + Add<T, Output = T> + Sub<T, Output = T> + Copy {
250 self.cofactor().transpose()
252 }
253
254 pub fn inverse(&self) -> Matrix4<T>
280 where T: Add<T, Output = T> + Mul<T, Output = T> + Sub<T, Output = T> + Div<T, Output = T> + Neg<Output = T> + Copy { let det: T = self.determinant();
282
283 let adjugate_mat = self.adjugate();
285
286 adjugate_mat / det
287 }
288}
289
290impl<T> Construct<T> for Matrix4<T> where T: Construct<T> {}
291impl<T> SqMatrix<T, Vector4<T>> for Matrix4<T> where T: Construct<T> {}
292
293impl<T> fmt::Debug for Matrix4<T>
294where T: fmt::Debug + Copy {
295 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
296 write!(f,"\n[ {:?}\t {:?}\t {:?}\t {:?}\t ]
297 \n[ {:?}\t {:?}\t {:?}\t {:?}\t ]
298 \n[ {:?}\t {:?}\t {:?}\t {:?}\t ]
299 \n[ {:?}\t {:?}\t {:?}\t {:?}\t ]",
300 self.m[0][0], self.m[0][1], self.m[0][2], self.m[0][3],
301 self.m[1][0], self.m[1][1], self.m[1][2], self.m[1][3],
302 self.m[2][0], self.m[2][1], self.m[2][2], self.m[2][3],
303 self.m[3][0], self.m[3][1], self.m[3][2], self.m[3][3])
304 }
305}
306
307impl<T> Add for Matrix4<T>
308where T: Add<T, Output = T> + Copy {
309 type Output = Self;
310
311 fn add(self, rhs: Self) -> Self::Output {
336 Matrix4{
337 m: [
338 [self.m[0][0] + rhs.m[0][0], self.m[0][1] + rhs.m[0][1], self.m[0][2] + rhs.m[0][2], self.m[0][3] + rhs.m[0][3]],
339 [self.m[1][0] + rhs.m[1][0], self.m[1][1] + rhs.m[1][1], self.m[1][2] + rhs.m[1][2], self.m[1][3] + rhs.m[1][3]],
340 [self.m[2][0] + rhs.m[2][0], self.m[2][1] + rhs.m[2][1], self.m[2][2] + rhs.m[2][2], self.m[2][3] + rhs.m[2][3]],
341 [self.m[3][0] + rhs.m[3][0], self.m[3][1] + rhs.m[3][1], self.m[3][2] + rhs.m[3][2], self.m[3][3] + rhs.m[3][3]],
342 ]
343 }
344 }
345}
346
347impl<T> Add<T> for Matrix4<T>
348where T: Add<T, Output = T> + Copy {
349 type Output = Self;
350
351 fn add(self, rhs: T) -> Self::Output {
371 Matrix4 {
372 m: [
373 [self.m[0][0] + rhs, self.m[0][1] + rhs, self.m[0][2] + rhs, self.m[0][3] + rhs],
374 [self.m[1][0] + rhs, self.m[1][1] + rhs, self.m[1][2] + rhs, self.m[1][3] + rhs],
375 [self.m[2][0] + rhs, self.m[2][1] + rhs, self.m[2][2] + rhs, self.m[2][3] + rhs],
376 [self.m[3][0] + rhs, self.m[3][1] + rhs, self.m[3][2] + rhs, self.m[3][3] + rhs],
377 ]
378 }
379 }
380}
381
382impl<T> Sub for Matrix4<T>
383where T: Sub<T, Output = T> + Copy {
384 type Output = Self;
385
386 fn sub(self, rhs: Self) -> Self::Output {
411 Matrix4 {
412 m: [
413 [self.m[0][0] - rhs.m[0][0], self.m[0][1] - rhs.m[0][1], self.m[0][2] - rhs.m[0][2], self.m[0][3] - rhs.m[0][3]],
414 [self.m[1][0] - rhs.m[1][0], self.m[1][1] - rhs.m[1][1], self.m[1][2] - rhs.m[1][2], self.m[1][3] - rhs.m[1][3]],
415 [self.m[2][0] - rhs.m[2][0], self.m[2][1] - rhs.m[2][1], self.m[2][2] - rhs.m[2][2], self.m[2][3] - rhs.m[2][3]],
416 [self.m[3][0] - rhs.m[3][0], self.m[3][1] - rhs.m[3][1], self.m[3][2] - rhs.m[3][2], self.m[3][3] - rhs.m[3][3]],
417 ]
418 }
419 }
420}
421
422impl<T> Sub<T> for Matrix4<T>
423where T: Sub<T, Output = T> + Copy {
424 type Output = Self;
425
426 fn sub(self, rhs: T) -> Self::Output {
446 Matrix4 {
447 m: [
448 [self.m[0][0] - rhs, self.m[0][1] - rhs, self.m[0][2] - rhs, self.m[0][3] - rhs],
449 [self.m[1][0] - rhs, self.m[1][1] - rhs, self.m[1][2] - rhs, self.m[1][3] - rhs],
450 [self.m[2][0] - rhs, self.m[2][1] - rhs, self.m[2][2] - rhs, self.m[2][3] - rhs],
451 [self.m[3][0] - rhs, self.m[3][1] - rhs, self.m[3][2] - rhs, self.m[3][3] - rhs],
452 ]
453 }
454 }
455}
456
457impl<T> Mul for Matrix4<T> where T: Add<T, Output = T> + Mul<T, Output = T> + Copy{
458 type Output = Self;
459
460 fn mul(self, rhs: Self) -> Self::Output {
484 Matrix4 {
485 m: [
486 [
487 self.m[0][0] * rhs.m[0][0]
488 + self.m[0][1] * rhs.m[1][0]
489 + self.m[0][2] * rhs.m[2][0]
490 + self.m[0][3] * rhs.m[3][0],
491 self.m[0][0] * rhs.m[0][1]
492 + self.m[0][1] * rhs.m[1][1]
493 + self.m[0][2] * rhs.m[2][1]
494 + self.m[0][3] * rhs.m[3][1],
495 self.m[0][0] * rhs.m[0][2]
496 + self.m[0][1] * rhs.m[1][2]
497 + self.m[0][2] * rhs.m[2][2]
498 + self.m[0][3] * rhs.m[3][2],
499 self.m[0][0] * rhs.m[0][3]
500 + self.m[0][1] * rhs.m[1][3]
501 + self.m[0][2] * rhs.m[2][3]
502 + self.m[0][3] * rhs.m[3][3],
503 ],
504 [
505 self.m[1][0] * rhs.m[0][0]
506 + self.m[1][1] * rhs.m[1][0]
507 + self.m[1][2] * rhs.m[2][0]
508 + self.m[1][3] * rhs.m[3][0],
509 self.m[1][0] * rhs.m[0][1]
510 + self.m[1][1] * rhs.m[1][1]
511 + self.m[1][2] * rhs.m[2][1]
512 + self.m[1][3] * rhs.m[3][1],
513 self.m[1][0] * rhs.m[0][2]
514 + self.m[1][1] * rhs.m[1][2]
515 + self.m[1][2] * rhs.m[2][2]
516 + self.m[1][3] * rhs.m[2][3],
517 self.m[1][0] * rhs.m[0][3]
518 + self.m[1][1] * rhs.m[1][3]
519 + self.m[1][2] * rhs.m[2][3]
520 + self.m[1][3] * rhs.m[3][3],
521 ],
522 [
523 self.m[2][0] * rhs.m[0][0]
524 + self.m[2][1] * rhs.m[1][0]
525 + self.m[2][2] * rhs.m[2][0]
526 + self.m[2][3] * rhs.m[3][0],
527 self.m[2][0] * rhs.m[0][1]
528 + self.m[2][1] * rhs.m[1][1]
529 + self.m[2][2] * rhs.m[2][1]
530 + self.m[2][3] * rhs.m[3][1],
531 self.m[2][0] * rhs.m[0][2]
532 + self.m[2][1] * rhs.m[1][2]
533 + self.m[2][2] * rhs.m[2][2]
534 + self.m[2][3] * rhs.m[3][2],
535 self.m[2][0] * rhs.m[0][3]
536 + self.m[2][1] * rhs.m[1][3]
537 + self.m[2][2] * rhs.m[2][3]
538 + self.m[2][3] * rhs.m[3][3],
539 ],
540 [
541 self.m[3][0] * rhs.m[0][0]
542 + self.m[3][1] * rhs.m[1][0]
543 + self.m[3][2] * rhs.m[2][0]
544 + self.m[3][3] * rhs.m[3][0],
545 self.m[3][0] * rhs.m[0][1]
546 + self.m[3][1] * rhs.m[1][1]
547 + self.m[3][2] * rhs.m[2][1]
548 + self.m[3][3] * rhs.m[3][1],
549 self.m[3][0] * rhs.m[0][2]
550 + self.m[3][1] * rhs.m[1][2]
551 + self.m[3][2] * rhs.m[2][2]
552 + self.m[3][3] * rhs.m[3][2],
553 self.m[3][0] * rhs.m[0][3]
554 + self.m[3][1] * rhs.m[1][3]
555 + self.m[3][2] * rhs.m[2][3]
556 + self.m[3][3] * rhs.m[3][3],
557 ],
558 ],
559 }
560 }
561}
562
563impl<T> Mul<Vector4<T>> for Matrix4<T> where T: Add<T, Output = T> + Mul<T, Output = T> + Copy{
564 type Output = Vector4<T>;
565
566 fn mul(self, rhs: Vector4<T>) -> Self::Output {
581 Vector4::new(
582 rhs.0 * self.m[0][0] + rhs.1 * self.m[0][1] + rhs.2 * self.m[0][2] + rhs.3 * self.m[0][3],
583 rhs.0 * self.m[1][0] + rhs.1 * self.m[1][1] + rhs.2 * self.m[1][2] + rhs.3 * self.m[1][3],
584 rhs.0 * self.m[2][0] + rhs.1 * self.m[2][1] + rhs.2 * self.m[2][2] + rhs.3 * self.m[2][3],
585 rhs.0 * self.m[3][0] + rhs.1 * self.m[3][1] + rhs.2 * self.m[3][2] + rhs.3 * self.m[3][3],
586 )
587 }
588}
589
590impl<T> Mul<T> for Matrix4<T> where T: Mul<T, Output = T> + Copy{
591 type Output = Matrix4<T>;
592
593 fn mul(self, rhs: T) -> Self::Output {
613 Matrix4 {
614 m: [
615 [self.m[0][0] * rhs, self.m[0][1] * rhs, self.m[0][2] * rhs, self.m[0][3] * rhs],
616 [self.m[1][0] * rhs, self.m[1][1] * rhs, self.m[1][2] * rhs, self.m[1][3] * rhs],
617 [self.m[2][0] * rhs, self.m[2][1] * rhs, self.m[2][2] * rhs, self.m[2][3] * rhs],
618 [self.m[3][0] * rhs, self.m[3][1] * rhs, self.m[3][2] * rhs, self.m[3][3] * rhs],
619 ],
620 }
621 }
622}
623
624impl<T> Div for Matrix4<T>
625where T: Add<T, Output = T> + Sub<T, Output = T> + Mul<T, Output = T> + Div<T, Output = T> + Neg<Output = T> + Copy {
626 type Output = Self;
627
628 fn div(self, rhs: Self) -> Self::Output {
653 let determinant = rhs.determinant();
656
657 let adjugate_mat = rhs.adjugate();
658
659 self * adjugate_mat / determinant
661 }
662}
663
664impl<T> Div<T> for Matrix4<T> where T: Div<T, Output = T> + Copy {
665 type Output = Matrix4<T>;
666
667 fn div(self, rhs: T) -> Self::Output {
687 Matrix4 {
688 m: [
689 [self.m[0][0] / rhs, self.m[0][1] / rhs, self.m[0][2] / rhs, self.m[0][3] / rhs],
690 [self.m[1][0] / rhs, self.m[1][1] / rhs, self.m[1][2] / rhs, self.m[1][3] / rhs],
691 [self.m[2][0] / rhs, self.m[2][1] / rhs, self.m[2][2] / rhs, self.m[2][3] / rhs],
692 [self.m[3][0] / rhs, self.m[3][1] / rhs, self.m[3][2] / rhs, self.m[3][3] / rhs],
693 ],
694 }
695 }
696}
697
698
699impl<T> Rem for Matrix4<T>
700where T: Rem<T, Output = T> + Copy {
701 type Output = Self;
702
703 fn rem(self, rhs: Self) -> Self::Output {
730 Matrix4::new(
731 [self.m[0][0] % rhs.m[0][0], self.m[0][1] % rhs.m[0][1], self.m[0][2] % rhs.m[0][2], self.m[0][3] % rhs.m[0][3]],
732 [self.m[1][0] % rhs.m[1][0], self.m[1][1] % rhs.m[1][1], self.m[1][2] % rhs.m[1][2], self.m[1][3] % rhs.m[1][3]],
733 [self.m[2][0] % rhs.m[2][0], self.m[2][1] % rhs.m[2][1], self.m[2][2] % rhs.m[2][2], self.m[2][3] % rhs.m[2][3]],
734 [self.m[3][0] % rhs.m[3][0], self.m[3][1] % rhs.m[3][1], self.m[3][2] % rhs.m[3][2], self.m[3][3] % rhs.m[3][3]],
735 )
736 }
737}
738
739impl<T> Rem<T> for Matrix4<T> where T: Rem<T, Output = T> + Copy {
740 type Output = Matrix4<T>;
741
742 fn rem(self, rhs: T) -> Self::Output {
772 Matrix4 {
773 m: [
774 [self.m[0][0] % rhs, self.m[0][1] % rhs, self.m[0][2] % rhs, self.m[0][3] % rhs],
775 [self.m[1][0] % rhs, self.m[1][1] % rhs, self.m[1][2] % rhs, self.m[1][3] % rhs],
776 [self.m[2][0] % rhs, self.m[2][1] % rhs, self.m[2][2] % rhs, self.m[2][3] % rhs],
777 [self.m[3][0] % rhs, self.m[3][1] % rhs, self.m[3][2] % rhs, self.m[3][3] % rhs],
778 ],
779 }
780 }
781}
782
783
784impl<T> Neg for Matrix4<T>
785where T: Neg<Output = T> + Copy {
786 type Output = Self;
787
788 fn neg(self) -> Self::Output {
808 Matrix4{
809 m: [
810 [-self.m[0][0], -self.m[0][1], -self.m[0][2], -self.m[0][3]],
811 [-self.m[1][0], -self.m[1][1], -self.m[1][2], -self.m[1][3]],
812 [-self.m[2][0], -self.m[2][1], -self.m[2][2], -self.m[2][3]],
813 [-self.m[3][0], -self.m[3][1], -self.m[3][2], -self.m[3][3]],
814 ],
815 }
816 }
817}
818
819impl<T> Zero for Matrix4<T>
820where T: Zero + Copy {
821 const ZERO: Self = Matrix4 {
822 m: [
823 [T::ZERO, T::ZERO, T::ZERO, T::ZERO],
824 [T::ZERO, T::ZERO, T::ZERO, T::ZERO],
825 [T::ZERO, T::ZERO, T::ZERO, T::ZERO],
826 [T::ZERO, T::ZERO, T::ZERO, T::ZERO]
827 ]
828 };
829}
830
831impl<T> One for Matrix4<T>
832where T: Zero + One {
833 const ONE: Self = Matrix4 {
835 m: [
836 [T::ONE , T::ZERO, T::ZERO, T::ZERO],
837 [T::ZERO, T::ONE , T::ZERO, T::ZERO],
838 [T::ZERO, T::ZERO, T::ONE , T::ZERO],
839 [T::ZERO, T::ZERO, T::ZERO, T::ONE ]
840 ]
841 };
842}
843
844impl<T> Two for Matrix4<T>
845where T: Zero + Two {
846 const TWO: Self = Matrix4 {
848 m: [
849 [T::TWO , T::ZERO, T::ZERO, T::ZERO],
850 [T::ZERO, T::TWO , T::ZERO, T::ZERO],
851 [T::ZERO, T::ZERO, T::TWO , T::ZERO],
852 [T::ZERO, T::ZERO, T::ZERO, T::TWO ]
853 ]
854 };
855}
856
857
858impl<T> From<Matrix4<T>> for [[T; 4]; 4] {
859 fn from(other: Matrix4<T>) -> [[T; 4]; 4] {
860 other.m
861 }
862}
863
864impl<T> F32Fmt for Matrix4<T>
865where T: F32Fmt + Copy {
866 type F32Fmt = Matrix4<T::F32Fmt>;
867 #[inline]
868 fn intoF32Fmt(self) -> Self::F32Fmt {
869 let m = &self.m;
870 Matrix4{
871 m: [
872 [m[0][0].intoF32Fmt(), m[0][1].intoF32Fmt(), m[0][2].intoF32Fmt(), m[0][3].intoF32Fmt()],
873 [m[1][0].intoF32Fmt(), m[1][1].intoF32Fmt(), m[1][2].intoF32Fmt(), m[1][3].intoF32Fmt()],
874 [m[2][0].intoF32Fmt(), m[2][1].intoF32Fmt(), m[2][2].intoF32Fmt(), m[2][3].intoF32Fmt()],
875 [m[3][0].intoF32Fmt(), m[3][1].intoF32Fmt(), m[3][2].intoF32Fmt(), m[3][3].intoF32Fmt()],
876 ]
877 }
878 }
879 #[inline]
880 fn fromF32Fmt(f32_fmt: Self::F32Fmt) -> Self {
881 let m = &f32_fmt.m;
882 Matrix4{
883 m: [
884 [T::fromF32Fmt(m[0][0]), T::fromF32Fmt(m[0][1]), T::fromF32Fmt(m[0][2]), T::fromF32Fmt(m[0][2])],
885 [T::fromF32Fmt(m[1][0]), T::fromF32Fmt(m[1][1]), T::fromF32Fmt(m[1][2]), T::fromF32Fmt(m[1][2])],
886 [T::fromF32Fmt(m[2][0]), T::fromF32Fmt(m[2][1]), T::fromF32Fmt(m[2][2]), T::fromF32Fmt(m[2][2])],
887 [T::fromF32Fmt(m[3][0]), T::fromF32Fmt(m[3][1]), T::fromF32Fmt(m[3][2]), T::fromF32Fmt(m[3][2])],
888 ]
889 }
890 }
891
892 fn sqrt(self) -> Self {
893 todo!()
894 }
895
896 fn cbrt(self) -> Self {
897 todo!()
898 }
899
900 fn f32_const_mul(self, constant: f32) -> Self {
901 Matrix4{
902 m: [
903 [self.m[0][0].f32_const_mul(constant), self.m[0][1].f32_const_mul(constant), self.m[0][2].f32_const_mul(constant), self.m[0][3].f32_const_mul(constant)],
904 [self.m[1][0].f32_const_mul(constant), self.m[1][1].f32_const_mul(constant), self.m[1][2].f32_const_mul(constant), self.m[1][3].f32_const_mul(constant)],
905 [self.m[2][0].f32_const_mul(constant), self.m[2][1].f32_const_mul(constant), self.m[2][2].f32_const_mul(constant), self.m[2][3].f32_const_mul(constant)],
906 [self.m[3][0].f32_const_mul(constant), self.m[3][1].f32_const_mul(constant), self.m[3][2].f32_const_mul(constant), self.m[3][3].f32_const_mul(constant)],
907 ]
908 }
909 }
910
911 fn sin_mul(self, _mul_by: Self) -> Self where Self: Mul<Self, Output = Self> + Sized {
912 todo!()
913 }
914
915 fn cos_mul(self, _mul_by: Self) -> Self where Self: Mul<Self, Output = Self> + Sized {
916 todo!()
917 }
918
919 fn tan_mul(self, _mul_by: Self) -> Self where Self: Mul<Self, Output = Self> + Sized {
920 todo!()
921 }
922
923 fn asin_mul(self, _mul_by: Self) -> Self where Self: Mul<Self, Output = Self> + Sized {
924 todo!()
925 }
926
927 fn acos_mul(self, _mul_by: Self) -> Self where Self: Mul<Self, Output = Self> + Sized {
928 todo!()
929 }
930
931 fn atan_mul(self, _mul_by: Self) -> Self where Self: Mul<Self, Output = Self> + Sized {
932 todo!()
933 }
934
935 fn atan2_mul(self, _other: Self, _mul_by: Self) -> Self where Self: Mul<Self, Output = Self> + Sized {
936 todo!()
937 }
938
939 fn sinh_mul(self, _mul_by: Self) -> Self where Self: Mul<Self, Output = Self> + Sized {
940 todo!()
941 }
942
943 fn cosh_mul(self, _mul_by: Self) -> Self where Self: Mul<Self, Output = Self> + Sized {
944 todo!()
945 }
946
947 fn tanh_mul(self, _mul_by: Self) -> Self where Self: Mul<Self, Output = Self> + Sized {
948 todo!()
949 }
950}
951
952impl<T> SignOps for Matrix4<T> {
953 fn ptcopysign(self, _sign: Self) -> Self {
954 todo!()
955 }
956
957 fn ptsignum(self) -> i8 {
958 todo!()
959 }
960
961 fn abs(self) -> Self {
962 todo!()
963 }
964}