use crate::core::*;
pub struct Transform2d {
}
pub struct Transform3 {
isometry: Isometry3<f32>,
scale: Vector3<f32>,
}
impl Transform3 {
pub fn new(
position: Translation3<f32>,
rotation: UnitQuaternion<f32>,
scale: Vector3<f32>,
) -> Self {
Self {
isometry: Isometry3::from_parts(na::convert(position), na::convert(rotation)),
scale: na::convert(scale),
}
}
pub fn default() -> Self {
Self {
isometry: Isometry3::identity(),
scale: Vector3::from_element(1.),
}
}
#[inline]
pub fn translation(&self) -> &Vector3<f32> {
&self.isometry.translation.vector
}
#[inline]
pub fn translation_mut(&mut self) -> &mut Vector3<f32> {
&mut self.isometry.translation.vector
}
#[inline]
pub fn rotation(&self) -> &UnitQuaternion<f32> {
&self.isometry.rotation
}
#[inline]
pub fn rotation_mut(&mut self) -> &mut UnitQuaternion<f32> {
&mut self.isometry.rotation
}
#[inline]
pub fn prepend_translation(&mut self, translation: Vector3<f32>) -> &mut Self {
self.isometry.translation.vector += translation;
self
}
#[inline]
pub fn append_translation(&mut self, translation: Vector3<f32>) -> &mut Self {
self.isometry.translation.vector += self.isometry.rotation * translation;
self
}
pub fn set_translation(
&mut self,
position: Vector3<f32>,
) -> &mut Self {
self.isometry.translation.vector = na::convert(position);
self
}
pub fn set_translation_xyz(&mut self, x: f32, y: f32, z: f32) -> &mut Self {
self.set_translation(Vector3::new(x, y, z))
}
pub fn set_rotation(
&mut self,
rotation: UnitQuaternion<f32>,
) -> &mut Self {
self.isometry.rotation = na::convert(rotation);
self
}
#[inline]
pub fn prepend_rotation(&mut self, axis: Unit<Vector3<f32>>, angle: f32) -> &mut Self {
let q = UnitQuaternion::from_axis_angle(&axis, angle);
self.isometry.rotation = q * self.isometry.rotation;
self
}
#[inline]
pub fn append_rotation(&mut self, axis: Unit<Vector3<f32>>, angle: f32) -> &mut Self {
self.isometry.rotation *= UnitQuaternion::from_axis_angle(&axis, angle);
self
}
#[inline]
pub fn matrix(&self) -> Matrix4<f32> {
self.isometry
.to_homogeneous()
.prepend_nonuniform_scaling(&self.scale)
}
pub fn isometry(&self) -> &Isometry3<f32> {
&self.isometry
}
pub fn position(&self) -> Point3<f32> {
Point3::from(self.isometry.translation.vector)
}
}