From a0cd3f77d8519dff45247e21a572fbc75c4bf760 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 4 Nov 2012 14:39:09 +1000 Subject: [PATCH] Reduce zero and one casts, implement new constructors --- src/matrix.rs | 121 +++++++++++++++++++++++++++------------- src/test/test_matrix.rs | 25 +++++++++ 2 files changed, 106 insertions(+), 40 deletions(-) diff --git a/src/matrix.rs b/src/matrix.rs index c649064..510c369 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -78,19 +78,29 @@ pub mod Mat2 { } #[inline(always)] - pub pure fn zero() -> Mat2 { - Mat2 { x: Vec2::zero(), - y: Vec2::zero() } + pub pure fn from_value(value: T) -> Mat2 { + let _0 = cast(0); + Mat2::new(value, _0, + _0, value) } #[inline(always)] - pub pure fn identity() -> Mat2 { - Mat2 { x: Vec2::unit_x(), - y: Vec2::unit_y() } + pub pure fn zero() -> Mat2 { + let _0 = cast(0); + Mat2::new(_0, _0, + _0, _0) + } + + #[inline(always)] + pub pure fn identity() -> Mat2 { + let _0 = cast(0); + let _1 = cast(1); + Mat2::new(_1, _0, + _0, _1) } } -pub impl Mat2: Matrix> { +pub impl Mat2: Matrix> { #[inline(always)] pure fn rows() -> uint { 2 } @@ -250,21 +260,32 @@ pub mod Mat3 { } #[inline(always)] - pub pure fn zero() -> Mat3 { - Mat3 { x: Vec3::zero(), - y: Vec3::zero(), - z: Vec3::zero() } + pub pure fn from_value(value: T) -> Mat3 { + let _0 = cast(0); + Mat3::new(value, _0, _0, + _0, value, _0, + _0, _0, value) } #[inline(always)] - pub pure fn identity() -> Mat3 { - Mat3 { x: Vec3::unit_x(), - y: Vec3::unit_y(), - z: Vec3::unit_z() } + pub pure fn zero() -> Mat3 { + let _0 = cast(0); + Mat3::new(_0, _0, _0, + _0, _0, _0, + _0, _0, _0) + } + + #[inline(always)] + pub pure fn identity() -> Mat3 { + let _0 = cast(0); + let _1 = cast(1); + Mat3::new(_1, _0, _0, + _0, _1, _0, + _0, _0, _1) } } -pub impl Mat3: Matrix> { +pub impl Mat3: Matrix> { #[inline(always)] pure fn rows() -> uint { 3 } @@ -373,20 +394,18 @@ pub impl Mat3: Matrix> { } } -pub impl Mat3: Matrix3 { +pub impl Mat3: Matrix3 { #[inline(always)] pure fn scale(vec: &Vec3) -> Mat3 { - self.mul_m(&Mat3::new( vec.x, from_int(0), from_int(0), - from_int(0), vec.y, from_int(0), - from_int(0), from_int(0), vec.z)) + let _0 = cast(0); + self.mul_m(&Mat3::new(vec.x, _0, _0, + _0, vec.y, _0, + _0, _0, vec.z)) } #[inline(always)] pure fn to_Mat4() -> Mat4 { - Mat4::new( self[0][0], self[0][1], self[0][2], from_int(0), - 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)) + Mat4::from_Mat3(&self) } } @@ -520,23 +539,44 @@ pub mod Mat4 { } #[inline(always)] - pub pure fn zero() -> Mat4 { - Mat4 { x: Vec4::zero(), - y: Vec4::zero(), - z: Vec4::zero(), - w: Vec4::zero() } + pub pure fn from_value(value: T) -> Mat4 { + let _0 = cast(0); + Mat4::new(value, _0, _0, _0, + _0, value, _0, _0, + _0, _0, value, _0, + _0, _0, _0, value) } #[inline(always)] - pub pure fn identity() -> Mat4 { - Mat4 { x: Vec4::unit_x(), - y: Vec4::unit_y(), - z: Vec4::unit_z(), - w: Vec4::unit_w() } + pub pure fn from_Mat3(m: &Mat3) -> Mat4 { + let _0 = cast(0); + Mat4::new(m[0][0], m[0][1], m[0][2], _0, + m[1][0], m[1][1], m[1][2], _0, + m[2][0], m[2][1], m[2][2], _0, + _0, _0, _0, cast(1)) + } + + #[inline(always)] + pub pure fn zero() -> Mat4 { + 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() -> Mat4 { + 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 Mat4: Matrix> { +pub impl Mat4: Matrix> { #[inline(always)] pure fn rows() -> uint { 4 } @@ -673,13 +713,14 @@ pub impl Mat4: Matrix> { } } -pub impl Mat4: Matrix4 { +pub impl Mat4: Matrix4 { #[inline(always)] pure fn scale(vec: &Vec3) -> Mat4 { - self.mul_m(&Mat4::new( vec.x, from_int(0), from_int(0), from_int(0), - from_int(0), vec.y, from_int(0), from_int(0), - from_int(0), from_int(0), vec.z, from_int(0), - from_int(0), from_int(0), from_int(0), from_int(1))) + let _0 = cast(0); + self.mul_m(&Mat4::new(vec.x, _0, _0, _0, + _0, vec.y, _0, _0, + _0, _0, vec.z, _0, + _0, _0, _0, cast(1))) } #[inline(always)] diff --git a/src/test/test_matrix.rs b/src/test/test_matrix.rs index 4debaea..aa3f227 100644 --- a/src/test/test_matrix.rs +++ b/src/test/test_matrix.rs @@ -18,6 +18,9 @@ fn test_Mat2() { assert a == Mat2::from_cols(Vec2::new(1f, 3f), Vec2::new(2f, 4f)); + assert Mat2::from_value::(4f64) == Mat2::new::(4f64, 0f64, + 0f64, 4f64); + assert a[0] == Vec2::new(1f, 3f); assert a[1] == Vec2::new(2f, 4f); @@ -65,6 +68,8 @@ fn test_Mat2() { assert c.is_symmetric(); assert !c.is_diagonal(); assert c.is_rotated(); + + assert Mat2::from_value(6f).is_diagonal(); } #[test] @@ -86,6 +91,10 @@ fn test_Mat3() { Vec3::new(2f, 5f, 8f), Vec3::new(3f, 6f, 9f)); + assert Mat3::from_value::(4f64) == Mat3::new::(4f64, 0f64, 0f64, + 0f64, 4f64, 0f64, + 0f64, 0f64, 4f64); + assert a[0] == Vec3::new(1f, 4f, 7f); assert a[1] == Vec3::new(2f, 5f, 8f); assert a[2] == Vec3::new(3f, 6f, 9f); @@ -149,6 +158,8 @@ fn test_Mat3() { 3f, 6f, 9f, 0f, 0f, 0f, 0f, 1f); + assert Mat3::from_value(6f).is_diagonal(); + // to_Quaternion } @@ -175,6 +186,18 @@ fn test_Mat4() { Vec4::new(3f, 7f, 11f, 15f), Vec4::new(4f, 8f, 12f, 16f)); + assert Mat4::from_value::(4f64) == Mat4::new::(4f64, 0f64, 0f64, 0f64, + 0f64, 4f64, 0f64, 0f64, + 0f64, 0f64, 4f64, 0f64, + 0f64, 0f64, 0f64, 4f64); + + assert Mat4::from_Mat3::(&Mat3::new(1f32, 4f32, 7f32, + 2f32, 5f32, 8f32, + 3f32, 6f32, 9f32)) == Mat4::new::(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[1] == Vec4::new(2f, 6f, 10f, 14f); assert a[2] == Vec4::new(3f, 7f, 11f, 15f); @@ -242,4 +265,6 @@ fn test_Mat4() { assert c.is_symmetric(); assert !c.is_diagonal(); assert c.is_rotated(); + + assert Mat4::from_value(6f).is_diagonal(); } \ No newline at end of file