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
use number_traits::{Num, Signed, Trig};

#[inline]
pub fn set_rotation<'a, 'b, T: Copy + Signed + Trig>(
    out: &'a mut [T; 4],
    angle: T,
) -> &'a mut [T; 4] {
    let c = angle.cos();
    let s = angle.sin();

    out[0] = c;
    out[1] = s;
    out[2] = -s;
    out[3] = c;
    out
}
#[test]
fn test_set_rotation() {
    use core::f32;
    use create;
    use misc;

    let mut m = create::new_identity::<f32>();
    set_rotation(&mut m, f32::consts::FRAC_PI_2);

    assert!(misc::eq(&m, &[0f32, 1f32, -1f32, 0f32]));
}

#[inline]
pub fn get_rotation<'a, 'b, T: Copy + Num + Trig>(out: &'b [T; 4]) -> T {
    out[1].atan2(&out[0])
}
#[test]
fn test_get_rotation() {
    use core::f32;
    use create;

    let mut m = create::new_identity::<f32>();
    set_rotation(&mut m, f32::consts::FRAC_PI_2);

    assert_eq!(get_rotation(&m), f32::consts::FRAC_PI_2);
}

#[inline]
pub fn rotate<'a, 'b, T: Copy + Signed + Trig>(
    out: &'a mut [T; 4],
    a: &'b [T; 4],
    angle: T,
) -> &'a mut [T; 4] {
    let m11 = a[0];
    let m12 = a[2];
    let m21 = a[1];
    let m22 = a[3];
    let c = angle.cos();
    let s = angle.sin();

    out[0] = m11 * c + m12 * -s;
    out[1] = m11 * s + m12 * c;
    out[2] = m21 * c + m22 * -s;
    out[3] = m21 * s + m22 * c;
    out
}
#[test]
fn test_rotate() {
    use core::f32;
    use create;
    use misc;

    let mut m = create::new_identity::<f32>();
    rotate(
        &mut m,
        &create::new_identity::<f32>(),
        f32::consts::FRAC_PI_2,
    );

    assert!(misc::eq(&m, &[0f32, 1f32, -1f32, 0f32]));
}