batbox_la/mat/_4x4/
ops.rs

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