Skip to main content

dynamis_model/
math.rs

1pub fn add(a: [f32; 3], b: [f32; 3]) -> [f32; 3] {
2    [a[0] + b[0], a[1] + b[1], a[2] + b[2]]
3}
4
5pub fn sub(a: [f32; 3], b: [f32; 3]) -> [f32; 3] {
6    [a[0] - b[0], a[1] - b[1], a[2] - b[2]]
7}
8
9pub fn mul(v: [f32; 3], scalar: f32) -> [f32; 3] {
10    [v[0] * scalar, v[1] * scalar, v[2] * scalar]
11}
12
13pub fn negate(v: [f32; 3]) -> [f32; 3] {
14    [-v[0], -v[1], -v[2]]
15}
16
17pub fn dot(a: [f32; 3], b: [f32; 3]) -> f32 {
18    a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
19}
20
21pub fn cross(a: [f32; 3], b: [f32; 3]) -> [f32; 3] {
22    [
23        a[1] * b[2] - a[2] * b[1],
24        a[2] * b[0] - a[0] * b[2],
25        a[0] * b[1] - a[1] * b[0],
26    ]
27}
28
29pub fn length(v: [f32; 3]) -> f32 {
30    dot(v, v).sqrt()
31}
32
33pub fn normalize(v: [f32; 3]) -> [f32; 3] {
34    mul(v, 1.0 / length(v))
35}
36
37pub fn quat_mul(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
38    [
39        a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],
40        a[3] * b[1] + a[1] * b[3] + a[2] * b[0] - a[0] * b[2],
41        a[3] * b[2] + a[2] * b[3] + a[0] * b[1] - a[1] * b[0],
42        a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],
43    ]
44}
45
46pub fn quat_conjugate(q: [f32; 4]) -> [f32; 4] {
47    [-q[0], -q[1], -q[2], q[3]]
48}
49
50pub fn quat_rotate(q: [f32; 4], v: [f32; 3]) -> [f32; 3] {
51    let u = [q[0], q[1], q[2]];
52    let s = q[3];
53    let dot = u[0] * v[0] + u[1] * v[1] + u[2] * v[2];
54    let square = u[0] * u[0] + u[1] * u[1] + u[2] * u[2];
55    let cross = [
56        u[1] * v[2] - u[2] * v[1],
57        u[2] * v[0] - u[0] * v[2],
58        u[0] * v[1] - u[1] * v[0],
59    ];
60    [
61        v[0] + 2.0 * (s * cross[0] + dot * u[0] - square * v[0]),
62        v[1] + 2.0 * (s * cross[1] + dot * u[1] - square * v[1]),
63        v[2] + 2.0 * (s * cross[2] + dot * u[2] - square * v[2]),
64    ]
65}