From 3ea0b3c5b2c950c4bb084485155a52eb5ccbf746 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Mon, 28 Sep 2015 00:29:12 +1000 Subject: [PATCH] Move some methods onto the Matrix trait Now we can call them like `Matrix4::identity()`! Yay! --- src/matrix.rs | 166 +++++++++++++++++--------------------------------- 1 file changed, 56 insertions(+), 110 deletions(-) diff --git a/src/matrix.rs b/src/matrix.rs index 4a9d07a..27c23cc 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -21,7 +21,7 @@ use std::ops::*; use rand::{Rand, Rng}; -use rust_num::{Zero, zero, One, one}; +use rust_num::{zero, one}; use rust_num::traits::cast; use angle::{Rad, sin, cos, sin_cos}; @@ -62,28 +62,6 @@ impl Matrix2 { } } -impl Matrix2 { - /// Create a new diagonal matrix, providing a single value to use for each - /// non-zero index. - #[inline] - pub fn from_value(value: S) -> Matrix2 { - Matrix2::new(value.clone(), zero(), - zero(), value.clone()) - } - - /// Create a zero matrix (all zeros). - #[inline] - pub fn zero() -> Matrix2 { - Matrix2::from_value(zero()) - } - - /// Create an identity matrix (diagonal matrix of ones). - #[inline] - pub fn identity() -> Matrix2 { - Matrix2::from_value(one()) - } -} - impl Matrix2 { /// Create a transformation matrix that will cause a vector to point at /// `dir`, using `up` for orientation. @@ -129,29 +107,6 @@ impl Matrix3 { } } -impl Matrix3 { - /// Create a new diagonal matrix, providing a single value to use for each - /// non-zero index. - #[inline] - pub fn from_value(value: S) -> Matrix3 { - Matrix3::new(value.clone(), zero(), zero(), - zero(), value.clone(), zero(), - zero(), zero(), value.clone()) - } - - /// Create a zero matrix (all zeros). - #[inline] - pub fn zero() -> Matrix3 { - Matrix3::from_value(zero()) - } - - /// Create an identity matrix (diagonal matrix of ones). - #[inline] - pub fn identity() -> Matrix3 { - Matrix3::from_value(one()) - } -} - impl Matrix3 { /// Create a transformation matrix that will cause a vector to point at /// `dir`, using `up` for orientation. @@ -225,13 +180,6 @@ impl Matrix3 { _1subc * axis.y * axis.z - s * axis.x, _1subc * axis.z * axis.z + c) } - - /// Create a matrix from a non-uniform scale - pub fn from_diagonal(value: &Vector3) -> Matrix3 { - Matrix3::new(value.x, zero(), zero(), - zero(), value.y, zero(), - zero(), zero(), value.z) - } } impl> Matrix3 { @@ -265,28 +213,6 @@ impl Matrix4 { } impl Matrix4 { - /// Create a new diagonal matrix, providing a single value to use for each - /// non-zero index. - #[inline] - pub fn from_value(value: S) -> Matrix4 { - Matrix4::new(value.clone(), zero(), zero(), zero(), - zero(), value.clone(), zero(), zero(), - zero(), zero(), value.clone(), zero(), - zero(), zero(), zero(), value.clone()) - } - - /// Create a zero matrix (all zeros). - #[inline] - pub fn zero() -> Matrix4 { - Matrix4::from_value(zero()) - } - - /// Create an identity matrix (diagonal matrix of ones). - #[inline] - pub fn identity() -> Matrix4 { - Matrix4::from_value(one()) - } - /// Create a translation matrix from a Vector3 #[inline] pub fn from_translation(v: &Vector3) -> Matrix4 { @@ -324,9 +250,20 @@ impl> Matrix4 { } pub trait Matrix + 'static>: Array2 - + Zero + One + ApproxEq + Sized { + /// Create a new diagonal matrix using the supplied value. + fn from_value(value: S) -> Self; + /// Create a matrix from a non-uniform scale + fn from_diagonal(value: &V) -> Self; + + /// Create a matrix with all elements equal to zero. + #[inline] + fn zero() -> Self { Self::from_value(zero()) } + /// Create a matrix where the each element of the diagonal is equal to one. + #[inline] + fn identity() -> Self { Self::from_value(one()) } + /// Multiply this matrix by a scalar, returning the new matrix. #[must_use] fn mul_s(&self, s: S) -> Self; @@ -402,7 +339,7 @@ pub trait Matrix + 'static>: Array2 /// Test if this matrix is the identity matrix. That is, it is diagonal /// and every element in the diagonal is one. #[inline] - fn is_identity(&self) -> bool { self.approx_eq(&one()) } + fn is_identity(&self) -> bool { self.approx_eq(&Self::identity()) } /// Test if this is a diagonal matrix. That is, every element outside of /// the diagonal is 0. @@ -482,27 +419,6 @@ impl> Neg for Matrix4 { } } -impl Zero for Matrix2 { - #[inline] - fn zero() -> Matrix2 { Matrix2::zero() } - #[inline] - fn is_zero(&self) -> bool{ *self == zero() } -} - -impl Zero for Matrix3 { - #[inline] - fn zero() -> Matrix3 { Matrix3::zero() } - #[inline] - fn is_zero(&self) -> bool{ *self == zero() } -} - -impl Zero for Matrix4 { - #[inline] - fn zero() -> Matrix4 { Matrix4::zero() } - #[inline] - fn is_zero(&self) -> bool{ *self == zero() } -} - impl Mul for Matrix2 { type Output = Matrix2; @@ -545,18 +461,6 @@ impl Mul for Matrix4 { fn mul(self, other: S) -> Matrix4 { self.mul_s(other) } } -impl One for Matrix2 { - #[inline] - fn one() -> Matrix2 { Matrix2::identity() } -} -impl One for Matrix3 { - #[inline] - fn one() -> Matrix3 { Matrix3::identity() } -} -impl One for Matrix4 { - #[inline] fn one() -> Matrix4 { Matrix4::identity() } -} - impl Array2, Vector2, S> for Matrix2 { #[inline] fn row(&self, r: usize) -> Vector2 { @@ -630,6 +534,18 @@ impl Array2, Vector4, S> for Matrix4 { } impl Matrix> for Matrix2 { + #[inline] + fn from_value(value: S) -> Matrix2 { + Matrix2::new(value, zero(), + zero(), value) + } + + #[inline] + fn from_diagonal(value: &Vector2) -> Matrix2 { + Matrix2::new(value.x, zero(), + zero(), value.y) + } + #[inline] fn mul_s(&self, s: S) -> Matrix2 { Matrix2::from_cols(self[0].mul_s(s), @@ -748,6 +664,20 @@ impl Matrix> for Matrix2 { } impl Matrix> for Matrix3 { + #[inline] + fn from_value(value: S) -> Matrix3 { + Matrix3::new(value, zero(), zero(), + zero(), value, zero(), + zero(), zero(), value) + } + + #[inline] + fn from_diagonal(value: &Vector3) -> Matrix3 { + Matrix3::new(value.x, zero(), zero(), + zero(), value.y, zero(), + zero(), zero(), value.z) + } + #[inline] fn mul_s(&self, s: S) -> Matrix3 { Matrix3::from_cols(self[0].mul_s(s), @@ -902,6 +832,22 @@ macro_rules! dot_matrix4( )); impl Matrix> for Matrix4 { + #[inline] + fn from_value(value: S) -> Matrix4 { + Matrix4::new(value, zero(), zero(), zero(), + zero(), value, zero(), zero(), + zero(), zero(), value, zero(), + zero(), zero(), zero(), value) + } + + #[inline] + fn from_diagonal(value: &Vector4) -> Matrix4 { + Matrix4::new(value.x, zero(), zero(), zero(), + zero(), value.y, zero(), zero(), + zero(), zero(), value.z, zero(), + zero(), zero(), zero(), value.w) + } + #[inline] fn mul_s(&self, s: S) -> Matrix4 { Matrix4::from_cols(self[0].mul_s(s),