use super::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum EulerOrder {
XYZ,
XZY,
YXZ,
YZX,
ZXY,
ZYX,
}
#[must_use]
#[inline]
pub fn quat_from_euler(x: f32, y: f32, z: f32, order: EulerOrder) -> Quat {
match order {
EulerOrder::XYZ => Quat::from_euler(glam::EulerRot::XYZ, x, y, z),
EulerOrder::XZY => Quat::from_euler(glam::EulerRot::XZY, x, z, y),
EulerOrder::YXZ => Quat::from_euler(glam::EulerRot::YXZ, y, x, z),
EulerOrder::YZX => Quat::from_euler(glam::EulerRot::YZX, y, z, x),
EulerOrder::ZXY => Quat::from_euler(glam::EulerRot::ZXY, z, x, y),
EulerOrder::ZYX => Quat::from_euler(glam::EulerRot::ZYX, z, y, x),
}
}
#[must_use]
#[inline]
pub fn quat_to_euler(q: Quat, order: EulerOrder) -> (f32, f32, f32) {
match order {
EulerOrder::XYZ => {
let (x, y, z) = q.to_euler(glam::EulerRot::XYZ);
(x, y, z)
}
EulerOrder::XZY => {
let (x, z, y) = q.to_euler(glam::EulerRot::XZY);
(x, y, z)
}
EulerOrder::YXZ => {
let (y, x, z) = q.to_euler(glam::EulerRot::YXZ);
(x, y, z)
}
EulerOrder::YZX => {
let (y, z, x) = q.to_euler(glam::EulerRot::YZX);
(x, y, z)
}
EulerOrder::ZXY => {
let (z, x, y) = q.to_euler(glam::EulerRot::ZXY);
(x, y, z)
}
EulerOrder::ZYX => {
let (z, y, x) = q.to_euler(glam::EulerRot::ZYX);
(x, y, z)
}
}
}
#[must_use]
#[inline]
pub fn quat_look_at(forward: Vec3, up: Vec3) -> Quat {
let f = forward.normalize();
let r = up.cross(f).normalize();
let u = f.cross(r);
Quat::from_mat3(&Mat3::from_cols(r, u, f))
}
#[must_use]
#[inline]
pub fn look_at_rh(eye: Vec3, target: Vec3, up: Vec3) -> Mat4 {
Mat4::look_at_rh(eye, target, up)
}