1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
use super::*; impl<T: Num + Copy> Add for Mat4<T> { type Output = Self; fn add(self, rhs: Self) -> Self { let mut result = self; result += rhs; result } } impl<T: Num + Copy + AddAssign> AddAssign for Mat4<T> { fn add_assign(&mut self, rhs: Self) { for i in 0..4 { for j in 0..4 { self[(i, j)] += rhs[(i, j)]; } } } } impl<T: Num + Copy> Sub for Mat4<T> { type Output = Self; fn sub(self, rhs: Self) -> Self { let mut result = self; result -= rhs; result } } impl<T: Num + Copy + SubAssign> SubAssign for Mat4<T> { fn sub_assign(&mut self, rhs: Self) { for i in 0..4 { for j in 0..4 { self[(i, j)] -= rhs[(i, j)]; } } } } impl<T: Num + Copy + Neg<Output = T>> Neg for Mat4<T> { type Output = Self; fn neg(self) -> Self { let mut result = self; for i in 0..4 { for j in 0..4 { result[(i, j)] = -result[(i, j)]; } } result } } impl<T: Num + Copy + AddAssign> Mul for Mat4<T> { type Output = Self; fn mul(self, rhs: Self) -> Self { let mut result = Mat4::new([[T::ZERO; 4]; 4]); for i in 0..4 { for j in 0..4 { let cur = &mut result[(i, j)]; for t in 0..4 { *cur += self[(i, t)] * rhs[(t, j)]; } } } result } } impl<T: Num + Copy + AddAssign> MulAssign for Mat4<T> { fn mul_assign(&mut self, rhs: Self) { *self = *self * rhs; } } impl<T: Num + Copy> Mul<T> for Mat4<T> { type Output = Self; fn mul(self, rhs: T) -> Self { let mut result = self; result *= rhs; result } } impl<T: Num + Copy + MulAssign> MulAssign<T> for Mat4<T> { fn mul_assign(&mut self, rhs: T) { for i in 0..4 { for j in 0..4 { self[(i, j)] *= rhs; } } } } impl<T: Num + Copy> Div<T> for Mat4<T> { type Output = Self; fn div(self, rhs: T) -> Self { let mut result = self; result /= rhs; result } } impl<T: Num + Copy + DivAssign> DivAssign<T> for Mat4<T> { fn div_assign(&mut self, rhs: T) { for i in 0..4 { for j in 0..4 { self[(i, j)] /= rhs; } } } } impl<T: Num + Copy> Mul<Vec4<T>> for Mat4<T> { type Output = Vec4<T>; fn mul(self, rhs: Vec4<T>) -> Vec4<T> { vec4( Vec4::dot(self.row(0), rhs), Vec4::dot(self.row(1), rhs), Vec4::dot(self.row(2), rhs), Vec4::dot(self.row(3), rhs), ) } }