1use core::ops::{Add, Mul, Neg};
2
3use num_traits::Float;
4
5#[inline]
14pub fn set_rotation<'out, T>(out: &'out mut [T; 4], angle: &T) -> &'out mut [T; 4]
15where
16 T: Float + Neg<Output = T>,
17{
18 let c = angle.cos();
19 let s = angle.sin();
20
21 out[0] = c;
22 out[1] = s;
23 out[2] = -s;
24 out[3] = c;
25 out
26}
27#[inline]
35pub fn rotation<'out, T>(out: &[T; 4]) -> T
36where
37 T: Clone + Float,
38{
39 out[1].atan2(out[0].clone())
40}
41#[inline]
50pub fn rotate<'out, T>(out: &'out mut [T; 4], a: &[T; 4], angle: &T) -> &'out mut [T; 4]
51where
52 T: Float + Add<T, Output = T>,
53 for<'a, 'b> &'a T: Mul<&'b T, Output = T> + Neg<Output = T>,
54{
55 let m11 = &a[0];
56 let m12 = &a[2];
57 let m21 = &a[1];
58 let m22 = &a[3];
59 let c = angle.cos();
60 let s = angle.sin();
61
62 out[0] = m11 * &c + m12 * &-&s;
63 out[1] = m11 * &s + m12 * &c;
64 out[2] = m21 * &c + m22 * &-&s;
65 out[3] = m21 * &s + m22 * &c;
66 out
67}