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
use number_traits::Num;

#[inline]
pub fn scale<'a, T: Copy + Num>(out: &'a mut [T; 9], a: &[T; 9], v: &[T; 3]) -> &'a mut [T; 9] {
    let x = v[0];
    let y = v[1];
    let z = v[2];

    out[0] = a[0] * x;
    out[3] = a[3] * y;
    out[6] = a[6] * z;
    out[1] = a[1] * x;
    out[4] = a[4] * y;
    out[7] = a[7] * z;
    out[2] = a[2] * x;
    out[5] = a[5] * y;
    out[8] = a[8] * z;
    out
}

#[inline]
pub fn from_quat<'a, T: Copy + Num>(out: &'a mut [T; 9], q: &[T; 4]) -> &'a mut [T; 9] {
    let x = q[0];
    let y = q[1];
    let z = q[2];
    let w = q[3];
    let x2 = x + x;
    let y2 = y + y;
    let z2 = z + z;
    let xx = x * x2;
    let xy = x * y2;
    let xz = x * z2;
    let yy = y * y2;
    let yz = y * z2;
    let zz = z * z2;
    let wx = w * x2;
    let wy = w * y2;
    let wz = w * z2;

    out[0] = T::one() - (yy + zz);
    out[1] = xy + wz;
    out[2] = xz - wy;

    out[3] = xy - wz;
    out[4] = T::one() - (xx + zz);
    out[5] = yz + wx;

    out[6] = xz + wy;
    out[7] = yz - wx;
    out[8] = T::one() - (xx + yy);
    out
}