pub fn add(a: [f32; 3], b: [f32; 3]) -> [f32; 3] {
[a[0] + b[0], a[1] + b[1], a[2] + b[2]]
}
pub fn sub(a: [f32; 3], b: [f32; 3]) -> [f32; 3] {
[a[0] - b[0], a[1] - b[1], a[2] - b[2]]
}
pub fn mul(v: [f32; 3], scalar: f32) -> [f32; 3] {
[v[0] * scalar, v[1] * scalar, v[2] * scalar]
}
pub fn negate(v: [f32; 3]) -> [f32; 3] {
[-v[0], -v[1], -v[2]]
}
pub fn dot(a: [f32; 3], b: [f32; 3]) -> f32 {
a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
}
pub fn cross(a: [f32; 3], b: [f32; 3]) -> [f32; 3] {
[
a[1] * b[2] - a[2] * b[1],
a[2] * b[0] - a[0] * b[2],
a[0] * b[1] - a[1] * b[0],
]
}
pub fn length(v: [f32; 3]) -> f32 {
dot(v, v).sqrt()
}
pub fn normalize(v: [f32; 3]) -> [f32; 3] {
mul(v, 1.0 / length(v))
}
pub fn quat_mul(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
[
a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],
a[3] * b[1] + a[1] * b[3] + a[2] * b[0] - a[0] * b[2],
a[3] * b[2] + a[2] * b[3] + a[0] * b[1] - a[1] * b[0],
a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],
]
}
pub fn quat_conjugate(q: [f32; 4]) -> [f32; 4] {
[-q[0], -q[1], -q[2], q[3]]
}
pub fn quat_rotate(q: [f32; 4], v: [f32; 3]) -> [f32; 3] {
let u = [q[0], q[1], q[2]];
let s = q[3];
let dot = u[0] * v[0] + u[1] * v[1] + u[2] * v[2];
let square = u[0] * u[0] + u[1] * u[1] + u[2] * u[2];
let cross = [
u[1] * v[2] - u[2] * v[1],
u[2] * v[0] - u[0] * v[2],
u[0] * v[1] - u[1] * v[0],
];
[
v[0] + 2.0 * (s * cross[0] + dot * u[0] - square * v[0]),
v[1] + 2.0 * (s * cross[1] + dot * u[1] - square * v[1]),
v[2] + 2.0 * (s * cross[2] + dot * u[2] - square * v[2]),
]
}