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}