Reduce zero and one casts, implement new constructors
This commit is contained in:
parent
2904be296e
commit
a0cd3f77d8
2 changed files with 106 additions and 40 deletions
121
src/matrix.rs
121
src/matrix.rs
|
@ -78,19 +78,29 @@ pub mod Mat2 {
|
|||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub pure fn zero<T:Num>() -> Mat2<T> {
|
||||
Mat2 { x: Vec2::zero(),
|
||||
y: Vec2::zero() }
|
||||
pub pure fn from_value<T:Copy NumCast>(value: T) -> Mat2<T> {
|
||||
let _0 = cast(0);
|
||||
Mat2::new(value, _0,
|
||||
_0, value)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub pure fn identity<T:Num>() -> Mat2<T> {
|
||||
Mat2 { x: Vec2::unit_x(),
|
||||
y: Vec2::unit_y() }
|
||||
pub pure fn zero<T:Copy NumCast>() -> Mat2<T> {
|
||||
let _0 = cast(0);
|
||||
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)]
|
||||
pure fn rows() -> uint { 2 }
|
||||
|
||||
|
@ -250,21 +260,32 @@ pub mod Mat3 {
|
|||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub pure fn zero<T:Num>() -> Mat3<T> {
|
||||
Mat3 { x: Vec3::zero(),
|
||||
y: Vec3::zero(),
|
||||
z: Vec3::zero() }
|
||||
pub pure fn from_value<T:Copy NumCast>(value: T) -> Mat3<T> {
|
||||
let _0 = cast(0);
|
||||
Mat3::new(value, _0, _0,
|
||||
_0, value, _0,
|
||||
_0, _0, value)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub pure fn identity<T:Num>() -> Mat3<T> {
|
||||
Mat3 { x: Vec3::unit_x(),
|
||||
y: Vec3::unit_y(),
|
||||
z: Vec3::unit_z() }
|
||||
pub pure fn zero<T:Copy NumCast>() -> Mat3<T> {
|
||||
let _0 = cast(0);
|
||||
Mat3::new(_0, _0, _0,
|
||||
_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)]
|
||||
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)]
|
||||
pure fn scale(vec: &Vec3<T>) -> Mat3<T> {
|
||||
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<T> {
|
||||
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<T:Num>() -> Mat4<T> {
|
||||
Mat4 { x: Vec4::zero(),
|
||||
y: Vec4::zero(),
|
||||
z: Vec4::zero(),
|
||||
w: Vec4::zero() }
|
||||
pub pure fn from_value<T:Copy NumCast>(value: T) -> Mat4<T> {
|
||||
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<T:Num>() -> Mat4<T> {
|
||||
Mat4 { x: Vec4::unit_x(),
|
||||
y: Vec4::unit_y(),
|
||||
z: Vec4::unit_z(),
|
||||
w: Vec4::unit_w() }
|
||||
pub pure fn from_Mat3<T:Copy NumCast>(m: &Mat3<T>) -> Mat4<T> {
|
||||
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<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)]
|
||||
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)]
|
||||
pure fn scale(vec: &Vec3<T>) -> Mat4<T> {
|
||||
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)]
|
||||
|
|
|
@ -18,6 +18,9 @@ fn test_Mat2() {
|
|||
assert a == Mat2::from_cols(Vec2::new(1f, 3f),
|
||||
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[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::<f64>(4f64) == Mat3::new::<f64>(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::<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[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();
|
||||
}
|
Loading…
Reference in a new issue