From 1538e6e528531c2594ab53b46255f8607dff45ed Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 22 Jul 2013 14:06:35 +1000 Subject: [PATCH] Merge quat impls --- src/math/quat.rs | 90 +++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/src/math/quat.rs b/src/math/quat.rs index f382787..3e14458 100644 --- a/src/math/quat.rs +++ b/src/math/quat.rs @@ -70,6 +70,16 @@ impl Quat { } impl Quat { + #[inline] + pub fn look_at(dir: &Vec3, up: &Vec3) -> Quat { + Mat3::look_at(dir, up).to_quat() + } + + #[inline] + pub fn from_axes(x: Vec3, y: Vec3, z: Vec3) -> Quat { + Mat3::from_axes(x, y, z).to_quat() + } + /// The multiplicative identity, ie: `q = 1 + 0i + 0j + 0i` #[inline] pub fn identity() -> Quat { @@ -179,52 +189,6 @@ impl Quat { pub fn nlerp(&self, other: &Quat, amount: T) -> Quat { self.mul_s(one!(T) - amount).add_q(&other.mul_s(amount)).normalize() } -} - -impl ToMat3 for Quat { - /// Convert the quaternion to a 3 x 3 rotation matrix - pub fn to_mat3(&self) -> Mat3 { - let x2 = self.v.x + self.v.x; - let y2 = self.v.y + self.v.y; - let z2 = self.v.z + self.v.z; - - let xx2 = x2 * self.v.x; - let xy2 = x2 * self.v.y; - let xz2 = x2 * self.v.z; - - let yy2 = y2 * self.v.y; - let yz2 = y2 * self.v.z; - let zz2 = z2 * self.v.z; - - let sy2 = y2 * self.s; - let sz2 = z2 * self.s; - let sx2 = x2 * self.s; - - let _1: T = one!(T); - - Mat3::new(_1 - yy2 - zz2, xy2 + sz2, xz2 - sy2, - xy2 - sz2, _1 - xx2 - zz2, yz2 + sx2, - xz2 + sy2, yz2 - sx2, _1 - xx2 - yy2) - } -} - -impl Neg> for Quat { - #[inline] - pub fn neg(&self) -> Quat { - Quat::from_sv(-self.s, -self.v) - } -} - -impl Quat { - #[inline] - pub fn look_at(dir: &Vec3, up: &Vec3) -> Quat { - Mat3::look_at(dir, up).to_quat() - } - - #[inline] - pub fn from_axes(x: Vec3, y: Vec3, z: Vec3) -> Quat { - Mat3::from_axes(x, y, z).to_quat() - } /// Spherical Linear Intoperlation /// @@ -269,3 +233,37 @@ impl Quat { } } } + +impl ToMat3 for Quat { + /// Convert the quaternion to a 3 x 3 rotation matrix + pub fn to_mat3(&self) -> Mat3 { + let x2 = self.v.x + self.v.x; + let y2 = self.v.y + self.v.y; + let z2 = self.v.z + self.v.z; + + let xx2 = x2 * self.v.x; + let xy2 = x2 * self.v.y; + let xz2 = x2 * self.v.z; + + let yy2 = y2 * self.v.y; + let yz2 = y2 * self.v.z; + let zz2 = z2 * self.v.z; + + let sy2 = y2 * self.s; + let sz2 = z2 * self.s; + let sx2 = x2 * self.s; + + let _1: T = one!(T); + + Mat3::new(_1 - yy2 - zz2, xy2 + sz2, xz2 - sy2, + xy2 - sz2, _1 - xx2 - zz2, yz2 + sx2, + xz2 + sy2, yz2 - sx2, _1 - xx2 - yy2) + } +} + +impl Neg> for Quat { + #[inline] + pub fn neg(&self) -> Quat { + Quat::from_sv(-self.s, -self.v) + } +}