1use core::ops::{Add, Div, Mul, Neg, Sub};
2
3use num_traits::{One, Zero};
4
5#[inline]
12pub fn transform_mat2<'out, T>(out: &'out mut [T; 3], v: &[T; 3], m: &[T; 4]) -> &'out mut [T; 3]
13where
14 T: Clone + Add<T, Output = T>,
15 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
16{
17 out[0] = &v[0] * &m[0] + &v[1] * &m[2];
18 out[1] = &v[0] * &m[1] + &v[1] * &m[3];
19 out[2] = v[2].clone();
20 out
21}
22#[inline]
29pub fn transform_mat2_mut<'out, T>(out: &'out mut [T; 3], m: &[T; 4]) -> &'out mut [T; 3]
30where
31 T: Clone + Add<T, Output = T>,
32 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
33{
34 let tmp = out.clone();
35 transform_mat2(out, &tmp, m)
36}
37#[inline]
46pub fn transform_mat3<'out, T>(out: &'out mut [T; 3], v: &[T; 3], m: &[T; 9]) -> &'out mut [T; 3]
47where
48 T: Add<T, Output = T>,
49 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
50{
51 out[0] = &v[0] * &m[0] + &v[1] * &m[3] + &v[2] * &m[6];
52 out[1] = &v[0] * &m[1] + &v[1] * &m[4] + &v[2] * &m[7];
53 out[2] = &v[0] * &m[2] + &v[1] * &m[5] + &v[2] * &m[8];
54 out
55}
56#[inline]
65pub fn transform_mat3_mut<'out, T>(out: &'out mut [T; 3], m: &[T; 9]) -> &'out mut [T; 3]
66where
67 T: Clone + Add<T, Output = T>,
68 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
69{
70 let tmp = out.clone();
71 transform_mat3(out, &tmp, m)
72}
73#[inline]
82pub fn transform_mat4<'out, T>(out: &'out mut [T; 3], v: &[T; 3], m: &[T; 16]) -> &'out mut [T; 3]
83where
84 T: Clone + Add<T, Output = T>,
85 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
86{
87 out[0] = &v[0] * &m[0] + &v[1] * &m[4] + &v[2] * &m[8] + m[12].clone();
88 out[1] = &v[0] * &m[1] + &v[1] * &m[5] + &v[2] * &m[9] + m[13].clone();
89 out[2] = &v[0] * &m[2] + &v[1] * &m[6] + &v[2] * &m[10] + m[14].clone();
90 out
91}
92#[inline]
101pub fn transform_mat4_mut<'out, T>(out: &'out mut [T; 3], m: &[T; 16]) -> &'out mut [T; 3]
102where
103 T: Clone + Add<T, Output = T>,
104 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
105{
106 let tmp = out.clone();
107 transform_mat4(out, &tmp, m)
108}
109#[inline]
118pub fn transform_mat4_rotation<'out, T>(
119 out: &'out mut [T; 3],
120 v: &[T; 3],
121 m: &[T; 16],
122) -> &'out mut [T; 3]
123where
124 T: Clone + Add<T, Output = T>,
125 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
126{
127 out[0] = &v[0] * &m[0] + &v[1] * &m[4] + &v[2] * &m[8];
128 out[1] = &v[0] * &m[1] + &v[1] * &m[5] + &v[2] * &m[9];
129 out[2] = &v[0] * &m[2] + &v[1] * &m[6] + &v[2] * &m[10];
130 out
131}
132#[inline]
141pub fn transform_mat4_rotation_mut<'out, T>(out: &'out mut [T; 3], m: &[T; 16]) -> &'out mut [T; 3]
142where
143 T: Clone + Add<T, Output = T>,
144 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
145{
146 let tmp = out.clone();
147 transform_mat4(out, &tmp, m)
148}
149#[inline]
158pub fn transform_mat4_projection<'out, T>(
159 out: &'out mut [T; 3],
160 v: &[T; 3],
161 m: &[T; 16],
162) -> &'out mut [T; 3]
163where
164 T: Clone + One + Zero + Add<T, Output = T>,
165 for<'a, 'b> &'a T: Div<&'b T, Output = T> + Mul<&'b T, Output = T>,
166{
167 let d = &v[0] * &m[3] + &v[1] * &m[7] + &v[2] * &m[11] + m[15].clone();
168 let inv_d = if d.is_zero() { d } else { &T::one() / &d };
169
170 out[0] = &(&v[0] * &m[0] + &v[1] * &m[4] + &v[2] * &m[8] + m[12].clone()) * &inv_d;
171 out[1] = &(&v[0] * &m[1] + &v[1] * &m[5] + &v[2] * &m[9] + m[13].clone()) * &inv_d;
172 out[2] = &(&v[0] * &m[2] + &v[1] * &m[6] + &v[2] * &m[10] + m[14].clone()) * &inv_d;
173 out
174}
175#[inline]
184pub fn transform_mat4_projection_mut<'out, T>(
185 out: &'out mut [T; 3],
186 m: &[T; 16],
187) -> &'out mut [T; 3]
188where
189 T: Clone + One + Zero + Add<T, Output = T>,
190 for<'a, 'b> &'a T: Div<&'b T, Output = T> + Mul<&'b T, Output = T>,
191{
192 let tmp = out.clone();
193 transform_mat4_projection(out, &tmp, m)
194}
195#[inline]
202pub fn transform_quat<'out, T>(out: &'out mut [T; 3], v: &[T; 3], q: &[T; 4]) -> &'out mut [T; 3]
203where
204 T: Add<T, Output = T> + Sub<T, Output = T>,
205 for<'a, 'b> &'a T: Neg<Output = T> + Mul<&'b T, Output = T>,
206{
207 let ix = &q[3] * &v[0] + &q[1] * &v[2] - &q[2] * &v[1];
208 let iy = &q[3] * &v[1] + &q[2] * &v[0] - &q[0] * &v[2];
209 let iz = &q[3] * &v[2] + &q[0] * &v[1] - &q[1] * &v[0];
210 let iw = &-&q[0] * &v[0] - &q[1] * &v[1] - &q[2] * &v[2];
211
212 out[0] = &ix * &q[3] + &iw * &-&q[0] + &iy * &-&q[2] - &iz * &-&q[1];
213 out[1] = &iy * &q[3] + &iw * &-&q[1] + &iz * &-&q[0] - &ix * &-&q[2];
214 out[2] = &iz * &q[3] + &iw * &-&q[2] + &ix * &-&q[1] - &iy * &-&q[0];
215 out
216}
217#[inline]
224pub fn transform_quat_mut<'out, T>(out: &'out mut [T; 3], q: &[T; 4]) -> &'out mut [T; 3]
225where
226 T: Clone + Add<T, Output = T> + Sub<T, Output = T>,
227 for<'a, 'b> &'a T: Neg<Output = T> + Mul<&'b T, Output = T>,
228{
229 let tmp = out.clone();
230 transform_quat(out, &tmp, q)
231}