Reduce zero and one casts, implement new constructors

This commit is contained in:
Brendan Zabarauskas 2012-11-04 14:39:09 +10:00
parent 2904be296e
commit a0cd3f77d8
2 changed files with 106 additions and 40 deletions

View file

@ -78,19 +78,29 @@ pub mod Mat2 {
} }
#[inline(always)] #[inline(always)]
pub pure fn zero<T:Num>() -> Mat2<T> { pub pure fn from_value<T:Copy NumCast>(value: T) -> Mat2<T> {
Mat2 { x: Vec2::zero(), let _0 = cast(0);
y: Vec2::zero() } Mat2::new(value, _0,
_0, value)
} }
#[inline(always)] #[inline(always)]
pub pure fn identity<T:Num>() -> Mat2<T> { pub pure fn zero<T:Copy NumCast>() -> Mat2<T> {
Mat2 { x: Vec2::unit_x(), let _0 = cast(0);
y: Vec2::unit_y() } Mat2::new(_0, _0,
_0, _0)
}
#[inline(always)]
pub pure fn identity<T:Copy NumCast>() -> Mat2<T> {
let _0 = cast(0);
let _1 = cast(1);
Mat2::new(_1, _0,
_0, _1)
} }
} }
pub impl<T:Copy Num Sqrt FuzzyEq> Mat2<T>: Matrix<T, Vec2<T>> { pub impl<T:Copy Num NumCast Sqrt FuzzyEq> Mat2<T>: Matrix<T, Vec2<T>> {
#[inline(always)] #[inline(always)]
pure fn rows() -> uint { 2 } pure fn rows() -> uint { 2 }
@ -250,21 +260,32 @@ pub mod Mat3 {
} }
#[inline(always)] #[inline(always)]
pub pure fn zero<T:Num>() -> Mat3<T> { pub pure fn from_value<T:Copy NumCast>(value: T) -> Mat3<T> {
Mat3 { x: Vec3::zero(), let _0 = cast(0);
y: Vec3::zero(), Mat3::new(value, _0, _0,
z: Vec3::zero() } _0, value, _0,
_0, _0, value)
} }
#[inline(always)] #[inline(always)]
pub pure fn identity<T:Num>() -> Mat3<T> { pub pure fn zero<T:Copy NumCast>() -> Mat3<T> {
Mat3 { x: Vec3::unit_x(), let _0 = cast(0);
y: Vec3::unit_y(), Mat3::new(_0, _0, _0,
z: Vec3::unit_z() } _0, _0, _0,
_0, _0, _0)
}
#[inline(always)]
pub pure fn identity<T:Copy NumCast>() -> Mat3<T> {
let _0 = cast(0);
let _1 = cast(1);
Mat3::new(_1, _0, _0,
_0, _1, _0,
_0, _0, _1)
} }
} }
pub impl<T:Copy Num Sqrt FuzzyEq> Mat3<T>: Matrix<T, Vec3<T>> { pub impl<T:Copy Num NumCast Sqrt FuzzyEq> Mat3<T>: Matrix<T, Vec3<T>> {
#[inline(always)] #[inline(always)]
pure fn rows() -> uint { 3 } pure fn rows() -> uint { 3 }
@ -373,20 +394,18 @@ pub impl<T:Copy Num Sqrt FuzzyEq> Mat3<T>: Matrix<T, Vec3<T>> {
} }
} }
pub impl<T:Copy Num Sqrt FuzzyEq> Mat3<T>: Matrix3<T> { pub impl<T:Copy Num NumCast Sqrt FuzzyEq> Mat3<T>: Matrix3<T> {
#[inline(always)] #[inline(always)]
pure fn scale(vec: &Vec3<T>) -> Mat3<T> { pure fn scale(vec: &Vec3<T>) -> Mat3<T> {
self.mul_m(&Mat3::new( vec.x, from_int(0), from_int(0), let _0 = cast(0);
from_int(0), vec.y, from_int(0), self.mul_m(&Mat3::new(vec.x, _0, _0,
from_int(0), from_int(0), vec.z)) _0, vec.y, _0,
_0, _0, vec.z))
} }
#[inline(always)] #[inline(always)]
pure fn to_Mat4() -> Mat4<T> { pure fn to_Mat4() -> Mat4<T> {
Mat4::new( self[0][0], self[0][1], self[0][2], from_int(0), Mat4::from_Mat3(&self)
self[1][0], self[1][1], self[1][2], from_int(0),
self[2][0], self[2][1], self[2][2], from_int(0),
from_int(0), from_int(0), from_int(0), from_int(1))
} }
} }
@ -520,23 +539,44 @@ pub mod Mat4 {
} }
#[inline(always)] #[inline(always)]
pub pure fn zero<T:Num>() -> Mat4<T> { pub pure fn from_value<T:Copy NumCast>(value: T) -> Mat4<T> {
Mat4 { x: Vec4::zero(), let _0 = cast(0);
y: Vec4::zero(), Mat4::new(value, _0, _0, _0,
z: Vec4::zero(), _0, value, _0, _0,
w: Vec4::zero() } _0, _0, value, _0,
_0, _0, _0, value)
} }
#[inline(always)] #[inline(always)]
pub pure fn identity<T:Num>() -> Mat4<T> { pub pure fn from_Mat3<T:Copy NumCast>(m: &Mat3<T>) -> Mat4<T> {
Mat4 { x: Vec4::unit_x(), let _0 = cast(0);
y: Vec4::unit_y(), Mat4::new(m[0][0], m[0][1], m[0][2], _0,
z: Vec4::unit_z(), m[1][0], m[1][1], m[1][2], _0,
w: Vec4::unit_w() } m[2][0], m[2][1], m[2][2], _0,
_0, _0, _0, cast(1))
}
#[inline(always)]
pub pure fn zero<T:Copy NumCast>() -> Mat4<T> {
let _0 = cast(0);
Mat4::new(_0, _0, _0, _0,
_0, _0, _0, _0,
_0, _0, _0, _0,
_0, _0, _0, _0)
}
#[inline(always)]
pub pure fn identity<T:Copy NumCast>() -> Mat4<T> {
let _0 = cast(0);
let _1 = cast(1);
Mat4::new(_1, _0, _0, _0,
_0, _1, _0, _0,
_0, _0, _1, _0,
_0, _0, _0, _1)
} }
} }
pub impl<T:Copy Num Sqrt FuzzyEq> Mat4<T>: Matrix<T, Vec4<T>> { pub impl<T:Copy Num NumCast Sqrt FuzzyEq> Mat4<T>: Matrix<T, Vec4<T>> {
#[inline(always)] #[inline(always)]
pure fn rows() -> uint { 4 } pure fn rows() -> uint { 4 }
@ -673,13 +713,14 @@ pub impl<T:Copy Num Sqrt FuzzyEq> Mat4<T>: Matrix<T, Vec4<T>> {
} }
} }
pub impl<T:Copy Num Sqrt FuzzyEq> Mat4<T>: Matrix4<T> { pub impl<T:Copy Num NumCast Sqrt FuzzyEq> Mat4<T>: Matrix4<T> {
#[inline(always)] #[inline(always)]
pure fn scale(vec: &Vec3<T>) -> Mat4<T> { pure fn scale(vec: &Vec3<T>) -> Mat4<T> {
self.mul_m(&Mat4::new( vec.x, from_int(0), from_int(0), from_int(0), let _0 = cast(0);
from_int(0), vec.y, from_int(0), from_int(0), self.mul_m(&Mat4::new(vec.x, _0, _0, _0,
from_int(0), from_int(0), vec.z, from_int(0), _0, vec.y, _0, _0,
from_int(0), from_int(0), from_int(0), from_int(1))) _0, _0, vec.z, _0,
_0, _0, _0, cast(1)))
} }
#[inline(always)] #[inline(always)]

View file

@ -18,6 +18,9 @@ fn test_Mat2() {
assert a == Mat2::from_cols(Vec2::new(1f, 3f), assert a == Mat2::from_cols(Vec2::new(1f, 3f),
Vec2::new(2f, 4f)); Vec2::new(2f, 4f));
assert Mat2::from_value::<f64>(4f64) == Mat2::new::<f64>(4f64, 0f64,
0f64, 4f64);
assert a[0] == Vec2::new(1f, 3f); assert a[0] == Vec2::new(1f, 3f);
assert a[1] == Vec2::new(2f, 4f); assert a[1] == Vec2::new(2f, 4f);
@ -65,6 +68,8 @@ fn test_Mat2() {
assert c.is_symmetric(); assert c.is_symmetric();
assert !c.is_diagonal(); assert !c.is_diagonal();
assert c.is_rotated(); assert c.is_rotated();
assert Mat2::from_value(6f).is_diagonal();
} }
#[test] #[test]
@ -86,6 +91,10 @@ fn test_Mat3() {
Vec3::new(2f, 5f, 8f), Vec3::new(2f, 5f, 8f),
Vec3::new(3f, 6f, 9f)); Vec3::new(3f, 6f, 9f));
assert Mat3::from_value::<f64>(4f64) == Mat3::new::<f64>(4f64, 0f64, 0f64,
0f64, 4f64, 0f64,
0f64, 0f64, 4f64);
assert a[0] == Vec3::new(1f, 4f, 7f); assert a[0] == Vec3::new(1f, 4f, 7f);
assert a[1] == Vec3::new(2f, 5f, 8f); assert a[1] == Vec3::new(2f, 5f, 8f);
assert a[2] == Vec3::new(3f, 6f, 9f); assert a[2] == Vec3::new(3f, 6f, 9f);
@ -149,6 +158,8 @@ fn test_Mat3() {
3f, 6f, 9f, 0f, 3f, 6f, 9f, 0f,
0f, 0f, 0f, 1f); 0f, 0f, 0f, 1f);
assert Mat3::from_value(6f).is_diagonal();
// to_Quaternion // to_Quaternion
} }
@ -175,6 +186,18 @@ fn test_Mat4() {
Vec4::new(3f, 7f, 11f, 15f), Vec4::new(3f, 7f, 11f, 15f),
Vec4::new(4f, 8f, 12f, 16f)); Vec4::new(4f, 8f, 12f, 16f));
assert Mat4::from_value::<f64>(4f64) == Mat4::new::<f64>(4f64, 0f64, 0f64, 0f64,
0f64, 4f64, 0f64, 0f64,
0f64, 0f64, 4f64, 0f64,
0f64, 0f64, 0f64, 4f64);
assert Mat4::from_Mat3::<f32>(&Mat3::new(1f32, 4f32, 7f32,
2f32, 5f32, 8f32,
3f32, 6f32, 9f32)) == Mat4::new::<f32>(1f32, 4f32, 7f32, 0f32,
2f32, 5f32, 8f32, 0f32,
3f32, 6f32, 9f32, 0f32,
0f32, 0f32, 0f32, 1f32);
assert a[0] == Vec4::new(1f, 5f, 9f, 13f); assert a[0] == Vec4::new(1f, 5f, 9f, 13f);
assert a[1] == Vec4::new(2f, 6f, 10f, 14f); assert a[1] == Vec4::new(2f, 6f, 10f, 14f);
assert a[2] == Vec4::new(3f, 7f, 11f, 15f); assert a[2] == Vec4::new(3f, 7f, 11f, 15f);
@ -242,4 +265,6 @@ fn test_Mat4() {
assert c.is_symmetric(); assert c.is_symmetric();
assert !c.is_diagonal(); assert !c.is_diagonal();
assert c.is_rotated(); assert c.is_rotated();
assert Mat4::from_value(6f).is_diagonal();
} }