use nalgebra as na;
pub type Mat3 = [[f64; 3]; 3];
pub type Mat4 = [[f64; 4]; 4];
pub type Vec3 = [f64; 3];
pub const IDENTITY3: Mat3 = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]];
pub const ZERO3: Mat3 = [[0.0; 3]; 3];
pub const ZERO_VEC3: Vec3 = [0.0; 3];
pub(crate) fn mat3(m: &Mat3) -> na::Matrix3<f64> {
na::Matrix3::new(
m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2],
)
}
pub(crate) fn unmat3(m: &na::Matrix3<f64>) -> Mat3 {
let mut out = ZERO3;
for (r, row) in out.iter_mut().enumerate() {
for (c, v) in row.iter_mut().enumerate() {
*v = m[(r, c)];
}
}
out
}
pub(crate) fn vec3(v: &Vec3) -> na::Vector3<f64> {
na::Vector3::new(v[0], v[1], v[2])
}
pub(crate) fn unvec3(v: &na::Vector3<f64>) -> Vec3 {
[v.x, v.y, v.z]
}
pub(crate) fn norm3(v: &Vec3) -> f64 {
v[0].hypot(v[1]).hypot(v[2])
}
pub(crate) fn dist3(a: &Vec3, b: &Vec3) -> f64 {
norm3(&[a[0] - b[0], a[1] - b[1], a[2] - b[2]])
}