1use core::ops::{Add, Div, Mul};
2
3use num_traits::real::Real;
4use num_traits::{One, Zero};
5
6#[inline]
16pub fn transform_angle<'out, T>(out: &'out mut [T; 2], v: &[T; 2], a: &T) -> &'out mut [T; 2]
17where
18 T: Real,
19 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
20{
21 let c = a.cos();
22 let s = a.sin();
23
24 out[0] = &v[0] * &c - &v[1] * &s;
25 out[1] = &v[0] * &s + &v[1] * &c;
26 out
27}
28#[inline]
38pub fn transform_angle_mut<'out, T>(out: &'out mut [T; 2], a: &T) -> &'out mut [T; 2]
39where
40 T: Real,
41 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
42{
43 let tmp = out.clone();
44 transform_angle(out, &tmp, a)
45}
46#[inline]
53pub fn transform_mat2<'out, T>(out: &'out mut [T; 2], v: &[T; 2], m: &[T; 4]) -> &'out mut [T; 2]
54where
55 T: Clone + Add<T, Output = T>,
56 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
57{
58 out[0] = &v[0] * &m[0] + &v[1] * &m[2];
59 out[1] = &v[0] * &m[1] + &v[1] * &m[3];
60 out
61}
62#[inline]
69pub fn transform_mat2_mut<'out, T>(out: &'out mut [T; 2], m: &[T; 4]) -> &'out mut [T; 2]
70where
71 T: Clone + Add<T, Output = T>,
72 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
73{
74 let tmp = out.clone();
75 transform_mat2(out, &tmp, m)
76}
77#[inline]
86pub fn transform_mat3<'out, T>(out: &'out mut [T; 2], v: &[T; 2], m: &[T; 9]) -> &'out mut [T; 2]
87where
88 T: Add<T, Output = T>,
89 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
90{
91 out[0] = &v[0] * &m[0] + &v[1] * &m[3];
92 out[1] = &v[0] * &m[1] + &v[1] * &m[4];
93 out
94}
95#[inline]
104pub fn transform_mat3_mut<'out, T>(out: &'out mut [T; 2], m: &[T; 9]) -> &'out mut [T; 2]
105where
106 T: Clone + Add<T, Output = T>,
107 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
108{
109 let tmp = out.clone();
110 transform_mat3(out, &tmp, m)
111}
112#[inline]
121pub fn transform_mat4<'out, T>(out: &'out mut [T; 2], v: &[T; 2], m: &[T; 16]) -> &'out mut [T; 2]
122where
123 T: Clone + Add<T, Output = T>,
124 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
125{
126 out[0] = &v[0] * &m[0] + &v[1] * &m[4] + m[12].clone();
127 out[1] = &v[0] * &m[1] + &v[1] * &m[5] + m[13].clone();
128 out
129}
130#[inline]
139pub fn transform_mat4_mut<'out, T>(out: &'out mut [T; 2], m: &[T; 16]) -> &'out mut [T; 2]
140where
141 T: Clone + Add<T, Output = T>,
142 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
143{
144 let tmp = out.clone();
145 transform_mat4(out, &tmp, m)
146}
147#[inline]
156pub fn transform_mat4_rotation<'out, T>(
157 out: &'out mut [T; 2],
158 v: &[T; 2],
159 m: &[T; 16],
160) -> &'out mut [T; 2]
161where
162 T: Clone + Add<T, Output = T>,
163 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
164{
165 out[0] = &v[0] * &m[0] + &v[1] * &m[4];
166 out[1] = &v[0] * &m[1] + &v[1] * &m[5];
167 out
168}
169#[inline]
178pub fn transform_mat4_rotation_mut<'out, T>(out: &'out mut [T; 2], m: &[T; 16]) -> &'out mut [T; 2]
179where
180 T: Clone + Add<T, Output = T>,
181 for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
182{
183 let tmp = out.clone();
184 transform_mat4(out, &tmp, m)
185}
186#[inline]
195pub fn transform_mat4_projection<'out, T>(
196 out: &'out mut [T; 2],
197 v: &[T; 2],
198 m: &[T; 16],
199) -> &'out mut [T; 2]
200where
201 T: Clone + One + Zero + Add<T, Output = T>,
202 for<'a, 'b> &'a T: Div<&'b T, Output = T> + Mul<&'b T, Output = T>,
203{
204 let d = &v[0] * &m[3] + &v[1] * &m[7] + m[15].clone();
205 let inv_d = if d.is_zero() { d } else { &T::one() / &d };
206
207 out[0] = &(&v[0] * &m[0] + &v[1] * &m[4] + m[12].clone()) * &inv_d;
208 out[1] = &(&v[0] * &m[1] + &v[1] * &m[5] + m[13].clone()) * &inv_d;
209 out
210}
211#[inline]
220pub fn transform_mat4_projection_mut<'out, T>(
221 out: &'out mut [T; 2],
222 m: &[T; 16],
223) -> &'out mut [T; 2]
224where
225 T: Clone + One + Zero + Add<T, Output = T>,
226 for<'a, 'b> &'a T: Div<&'b T, Output = T> + Mul<&'b T, Output = T>,
227{
228 let tmp = out.clone();
229 transform_mat4_projection(out, &tmp, m)
230}