Added component wise casting number for the matrix and point types.

This commit is contained in:
Marckvdv 2016-10-03 12:51:41 +02:00
parent f6a68a1607
commit d2d35b808b
2 changed files with 23 additions and 5 deletions

View file

@ -14,7 +14,7 @@
// limitations under the License. // limitations under the License.
use rand::{Rand, Rng}; use rand::{Rand, Rng};
use num_traits::cast; use num_traits::{cast, NumCast};
use std::fmt; use std::fmt;
use std::mem; use std::mem;
use std::ops::*; use std::ops::*;
@ -917,7 +917,7 @@ impl<S: BaseFloat> Transform3<S> for Matrix3<S> {}
impl<S: BaseFloat> Transform3<S> for Matrix4<S> {} impl<S: BaseFloat> Transform3<S> for Matrix4<S> {}
macro_rules! impl_operators { macro_rules! impl_matrix {
($MatrixN:ident, $VectorN:ident { $($field:ident : $row_index:expr),+ }) => { ($MatrixN:ident, $VectorN:ident { $($field:ident : $row_index:expr),+ }) => {
impl_operator!(<S: BaseFloat> Neg for $MatrixN<S> { impl_operator!(<S: BaseFloat> Neg for $MatrixN<S> {
fn neg(matrix) -> $MatrixN<S> { $MatrixN { $($field: -matrix.$field),+ } } fn neg(matrix) -> $MatrixN<S> { $MatrixN { $($field: -matrix.$field),+ } }
@ -971,6 +971,15 @@ macro_rules! impl_operators {
impl_scalar_ops!($MatrixN<i64> { $($field),+ }); impl_scalar_ops!($MatrixN<i64> { $($field),+ });
impl_scalar_ops!($MatrixN<f32> { $($field),+ }); impl_scalar_ops!($MatrixN<f32> { $($field),+ });
impl_scalar_ops!($MatrixN<f64> { $($field),+ }); impl_scalar_ops!($MatrixN<f64> { $($field),+ });
impl<S: NumCast + Copy> $MatrixN<S> {
/// Component-wise casting to another type
#[inline]
pub fn cast<T: NumCast>(&self) -> $MatrixN<T> {
$MatrixN { $($field: self.$field.cast() ),+ }
}
}
} }
} }
@ -988,9 +997,9 @@ macro_rules! impl_scalar_ops {
}; };
} }
impl_operators!(Matrix2, Vector2 { x: 0, y: 1 }); impl_matrix!(Matrix2, Vector2 { x: 0, y: 1 });
impl_operators!(Matrix3, Vector3 { x: 0, y: 1, z: 2 }); impl_matrix!(Matrix3, Vector3 { x: 0, y: 1, z: 2 });
impl_operators!(Matrix4, Vector4 { x: 0, y: 1, z: 2, w: 3 }); impl_matrix!(Matrix4, Vector4 { x: 0, y: 1, z: 2, w: 3 });
impl_operator!(<S: BaseFloat> Mul<Matrix2<S> > for Matrix2<S> { impl_operator!(<S: BaseFloat> Mul<Matrix2<S> > for Matrix2<S> {
fn mul(lhs, rhs) -> Matrix2<S> { fn mul(lhs, rhs) -> Matrix2<S> {

View file

@ -17,6 +17,7 @@
//! disinguishes them from vectors, which have a length and direction, but do //! disinguishes them from vectors, which have a length and direction, but do
//! not have a fixed position. //! not have a fixed position.
use num_traits::NumCast;
use std::fmt; use std::fmt;
use std::mem; use std::mem;
use std::ops::*; use std::ops::*;
@ -128,6 +129,14 @@ macro_rules! impl_point {
} }
} }
impl<S: NumCast + Copy> $PointN<S> {
/// Component-wise casting to another type
#[inline]
pub fn cast<T: NumCast>(&self) -> $PointN<T> {
$PointN { $($field: NumCast::from(self.$field).unwrap()),+ }
}
}
impl<S: BaseFloat> MetricSpace for $PointN<S> { impl<S: BaseFloat> MetricSpace for $PointN<S> {
type Metric = S; type Metric = S;