Change quaternion constructors to static methods

This commit is contained in:
Brendan Zabarauskas 2012-11-21 11:56:39 +10:00
parent 525c3f9354
commit 8a9668c39c
2 changed files with 13 additions and 25 deletions

View file

@ -57,37 +57,19 @@ pub trait ToQuat<T> {
pub struct Quat<T> { w: T, x: T, y: T, z: T }
pub mod Quat {
pub impl<T:Copy> Quat<T> {
#[inline(always)]
pub pure fn new<T>(w: T, x: T, y: T, z: T) -> Quat<T> {
static pure fn new(w: T, x: T, y: T, z: T) -> Quat<T> {
Quat { w: move w, x: move x, y: move y, z: move z }
}
#[inline(always)]
pub pure fn from_sv<T:Copy>(s: T, v: Vec3<T>) -> Quat<T> {
Quat::new(s, v.x, v.y, v.z)
}
#[inline(always)]
pub pure fn from_axis_angle<T:Copy Num NumCast Trig AngleConv>(axis: Vec3<T>, theta: T) -> Quat<T> {
let half = radians(&theta) / cast(2);
from_sv(cos(&half), axis.mul_t(sin(&half)))
}
#[inline(always)]
pub pure fn zero<T:Copy NumCast>() -> Quat<T> {
let _0 = cast(0);
Quat::new(_0, _0, _0, _0)
}
#[inline(always)]
pub pure fn identity<T:Copy NumCast>() -> Quat<T> {
let _0 = cast(0);
Quat::new(cast(1), _0, _0, _0)
static pure fn from_sv(s: T, v: &Vec3<T>) -> Quat<T> {
Quat::new(move s, v.x, v.y, v.z)
}
}
pub impl<T:Copy Num NumCast Trig Exp Extent Ord FuzzyEq> Quat<T>: Quaternion<T> {
pub impl<T:Copy Num NumCast Trig Exp Extent Ord AngleConv> Quat<T>: Quaternion<T> {
#[inline(always)]
static pure fn identity() -> Quat<T> {
Quat::new(NumCast::one(),
@ -243,6 +225,12 @@ pub impl<T:Copy Num NumCast Trig Exp Extent Ord FuzzyEq> Quat<T>: Quaternion<T>
self.mul_t(cos(&theta)).add_q(&q.mul_t(sin(&theta)))
}
#[inline(always)]
pub pure fn from_axis_angle(axis: Vec3<T>, theta: T) -> Quat<T> {
let half = radians(&theta) / cast(2);
Quat::from_sv(cos(&half), &axis.mul_t(sin(&half)))
}
#[inline(always)]
pure fn to_Mat3() -> Mat3<T> {

View file

@ -13,8 +13,8 @@ fn test_Quat() {
assert a == Quat::new(1f, 2f, 3f, 4f);
assert Quat::zero() == Quat::new(0f, 0f, 0f, 0f);
assert Quat::identity() == Quat::new(1f, 0f, 0f, 0f);
// assert Quat::zero() == Quat::new(0f, 0f, 0f, 0f);
// assert Quat::identity() == Quat::new(1f, 0f, 0f, 0f);
assert a.w == 1f;
assert a.x == 2f;