use crate::math::{Pose, Vector};
pub trait PoseOps {
fn absolute_transform_vector(&self, v: Vector) -> Vector;
}
impl PoseOps for Pose {
#[inline]
fn absolute_transform_vector(&self, v: Vector) -> Vector {
#[cfg(feature = "dim3")]
{
let rot_matrix = crate::math::Matrix::from_quat(self.rotation);
rot_matrix.abs() * v
}
#[cfg(feature = "dim2")]
{
let rot_matrix = self.rotation.to_mat();
rot_matrix.abs() * v
}
}
}
pub trait PoseOpt {
fn inv_mul(self, rhs: &Pose) -> Pose;
fn prepend_to(self, rhs: &Pose) -> Pose;
fn transform_point(self, p: Vector) -> Vector;
fn inverse_transform_point(self, p: Vector) -> Vector;
}
impl PoseOpt for Option<&Pose> {
#[inline]
fn inv_mul(self, rhs: &Pose) -> Pose {
if let Some(iso) = self {
iso.inv_mul(rhs)
} else {
*rhs
}
}
#[inline]
fn prepend_to(self, rhs: &Pose) -> Pose {
if let Some(iso) = self {
*rhs * *iso
} else {
*rhs
}
}
#[inline]
fn transform_point(self, p: Vector) -> Vector {
if let Some(iso) = self {
iso * p
} else {
p
}
}
#[inline]
fn inverse_transform_point(self, p: Vector) -> Vector {
if let Some(iso) = self {
iso.inverse_transform_point(p)
} else {
p
}
}
}
impl PoseOpt for Option<Pose> {
#[inline]
fn inv_mul(self, rhs: &Pose) -> Pose {
if let Some(iso) = self {
iso.inv_mul(rhs)
} else {
*rhs
}
}
#[inline]
fn prepend_to(self, rhs: &Pose) -> Pose {
if let Some(iso) = self {
*rhs * iso
} else {
*rhs
}
}
#[inline]
fn transform_point(self, p: Vector) -> Vector {
if let Some(iso) = self {
iso * p
} else {
p
}
}
#[inline]
fn inverse_transform_point(self, p: Vector) -> Vector {
if let Some(iso) = self {
iso.inverse_transform_point(p)
} else {
p
}
}
}