use nalgebra::{Isometry3, Translation3, UnitQuaternion};
use crate::{Frame, Point3, UnitVec3, Vec3};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Isometry {
inner: Isometry3<f64>,
}
impl Isometry {
pub fn new(rotation: UnitQuaternion<f64>, translation: Vec3) -> Self {
Isometry {
inner: Isometry3::from_parts(Translation3::from(translation), rotation),
}
}
pub fn identity() -> Self {
Isometry {
inner: Isometry3::identity(),
}
}
pub fn from_translation(v: Vec3) -> Self {
Self::new(UnitQuaternion::identity(), v)
}
pub fn from_rotation(rotation: UnitQuaternion<f64>) -> Self {
Self::new(rotation, Vec3::zeros())
}
pub fn rotation(&self) -> UnitQuaternion<f64> {
self.inner.rotation
}
pub fn translation(&self) -> Vec3 {
self.inner.translation.vector
}
pub fn apply(&self, p: Point3) -> Point3 {
self.inner.transform_point(&p)
}
pub fn apply_vec(&self, v: Vec3) -> Vec3 {
self.inner.transform_vector(&v)
}
pub fn apply_unit(&self, u: UnitVec3) -> UnitVec3 {
UnitVec3::new_normalize(self.inner.transform_vector(&u))
}
pub fn apply_frame(&self, frame: &Frame) -> Frame {
frame.transformed(self)
}
pub fn then(&self, next: &Isometry) -> Isometry {
Isometry {
inner: next.inner * self.inner,
}
}
pub fn inverse(&self) -> Isometry {
Isometry {
inner: self.inner.inverse(),
}
}
}
impl Default for Isometry {
fn default() -> Self {
Self::identity()
}
}