Merge branch 'refs/heads/luqmana-master'
This commit is contained in:
commit
c6a7018aec
2 changed files with 34 additions and 2 deletions
30
src/mat.rs
30
src/mat.rs
|
@ -98,8 +98,10 @@ pub trait NumericMatrixNxN<T, ColRow>: MatrixNxN<T, ColRow>,
|
|||
static pure fn identity() -> self;
|
||||
|
||||
pure fn mul_m(other: &self) -> self;
|
||||
pure fn dot(other: &self) -> T;
|
||||
|
||||
pure fn det() -> T;
|
||||
pure fn trace() -> T;
|
||||
|
||||
pure fn invert() -> Option<self>;
|
||||
pure fn transpose() -> self;
|
||||
|
@ -261,11 +263,19 @@ pub impl<T:Copy Num NumCast DefaultEq> Mat2<T>: NumericMatrixNxN<T, Vec2<T>> {
|
|||
Mat2::new(self.row(0).dot(&other.col(0)), self.row(1).dot(&other.col(0)),
|
||||
self.row(0).dot(&other.col(1)), self.row(1).dot(&other.col(1)))
|
||||
}
|
||||
|
||||
pure fn dot(other: &Mat2<T>) -> T {
|
||||
other.transpose().mul_m(&self).trace()
|
||||
}
|
||||
|
||||
pure fn det() -> T {
|
||||
self[0][0] * self[1][1] - self[1][0] * self[0][1]
|
||||
}
|
||||
|
||||
pure fn trace() -> T {
|
||||
self[0][0] + self[1][1]
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pure fn invert() -> Option<Mat2<T>> {
|
||||
let _0 = cast(0);
|
||||
|
@ -504,10 +514,18 @@ pub impl<T:Copy Num NumCast DefaultEq> Mat3<T>: NumericMatrixNxN<T, Vec3<T>> {
|
|||
self.row(0).dot(&other.col(2)), self.row(1).dot(&other.col(2)), self.row(2).dot(&other.col(2)))
|
||||
}
|
||||
|
||||
pure fn dot(other: &Mat3<T>) -> T {
|
||||
other.transpose().mul_m(&self).trace()
|
||||
}
|
||||
|
||||
pure fn det() -> T {
|
||||
self.col(0).dot(&self.col(1).cross(&self.col(2)))
|
||||
}
|
||||
|
||||
pure fn trace() -> T {
|
||||
self[0][0] + self[1][1] + self[2][2]
|
||||
}
|
||||
|
||||
// #[inline(always)]
|
||||
pure fn invert() -> Option<Mat3<T>> {
|
||||
let d = self.det();
|
||||
|
@ -566,14 +584,14 @@ pub impl<T:Copy NumCast> Mat3<T>: NumericMatrix3x3<T, Vec3<T>> {
|
|||
}
|
||||
}
|
||||
|
||||
pub impl<T:Copy Num NumCast Ord> Mat3<T>: ToQuat<T> {
|
||||
pub impl<T:Copy Num NumCast Ord DefaultEq> Mat3<T>: ToQuat<T> {
|
||||
pure fn to_Quat() -> Quat<T> {
|
||||
// Implemented using a mix of ideas from jMonkeyEngine and Ken Shoemake's
|
||||
// paper on Quaternions: http://www.cs.ucr.edu/~vbz/resources/Quatut.pdf
|
||||
|
||||
let mut s: float;
|
||||
let w: float, x: float, y: float, z: float;
|
||||
let trace: float = cast(self[0][0] + self[1][1] + self[2][2]);
|
||||
let trace: float = cast(self.trace());
|
||||
|
||||
if trace >= cast(0) {
|
||||
s = (trace + 1f).sqrt();
|
||||
|
@ -828,6 +846,10 @@ pub impl<T:Copy Num NumCast DefaultEq Signed Ord> Mat4<T>: NumericMatrixNxN<T, V
|
|||
self.row(0).dot(&other.col(3)), self.row(1).dot(&other.col(3)), self.row(2).dot(&other.col(3)), self.row(3).dot(&other.col(3)))
|
||||
}
|
||||
|
||||
pure fn dot(other: &Mat4<T>) -> T {
|
||||
other.transpose().mul_m(&self).trace()
|
||||
}
|
||||
|
||||
pure fn det() -> T {
|
||||
self[0][0]*Mat3::new(self[1][1], self[2][1], self[3][1],
|
||||
self[1][2], self[2][2], self[3][2],
|
||||
|
@ -843,6 +865,10 @@ pub impl<T:Copy Num NumCast DefaultEq Signed Ord> Mat4<T>: NumericMatrixNxN<T, V
|
|||
self[0][3], self[1][3], self[2][3]).det()
|
||||
}
|
||||
|
||||
pure fn trace() -> T {
|
||||
self[0][0] + self[1][1] + self[2][2] + self[3][3]
|
||||
}
|
||||
|
||||
pure fn invert() -> Option<Mat4<T>> {
|
||||
let d = self.det();
|
||||
let _0 = cast(0);
|
||||
|
|
|
@ -31,6 +31,7 @@ fn test_Mat2() {
|
|||
assert a.col(1) == Vec2::new(2f, 4f);
|
||||
|
||||
assert a.det() == -2f;
|
||||
assert a.trace() == 5f;
|
||||
|
||||
assert a.neg() == Mat2::new(-1f, -3f,
|
||||
-2f, -4f);
|
||||
|
@ -46,6 +47,7 @@ fn test_Mat2() {
|
|||
-1f, -1f);
|
||||
assert a.mul_m(&b) == Mat2::new(10.0, 22.0,
|
||||
13.0, 29.0);
|
||||
assert a.dot(&b) == 40f;
|
||||
|
||||
assert a.transpose() == Mat2::new(1f, 2f,
|
||||
3f, 4f);
|
||||
|
@ -135,6 +137,7 @@ fn test_Mat3() {
|
|||
assert a.col(2) == Vec3::new(3f, 6f, 9f);
|
||||
|
||||
assert a.det() == 0f;
|
||||
assert a.trace() == 15f;
|
||||
|
||||
assert a.neg() == Mat3::new(-1f, -4f, -7f,
|
||||
-2f, -5f, -8f,
|
||||
|
@ -155,6 +158,7 @@ fn test_Mat3() {
|
|||
assert a.mul_m(&b) == Mat3::new(36f, 81f, 126f,
|
||||
42f, 96f, 150f,
|
||||
48f, 111f, 174f);
|
||||
assert a.dot(&b) == 330f;
|
||||
|
||||
assert a.transpose() == Mat3::new(1f, 2f, 3f,
|
||||
4f, 5f, 6f,
|
||||
|
@ -269,6 +273,7 @@ fn test_Mat4() {
|
|||
assert a.col(3) == Vec4::new(4f, 8f, 12f, 16f);
|
||||
|
||||
assert a.det() == 0f;
|
||||
assert a.trace() == 34f;
|
||||
|
||||
assert a.neg() == Mat4::new(-1f, -5f, -9f, -13f,
|
||||
-2f, -6f, -10f, -14f,
|
||||
|
@ -294,6 +299,7 @@ fn test_Mat4() {
|
|||
110f, 254f, 398f, 542f,
|
||||
120f, 280f, 440f, 600f,
|
||||
130f, 306f, 482f, 658f);
|
||||
assert a.dot(&b) == 1632f;
|
||||
|
||||
assert a.transpose() == Mat4::new( 1f, 2f, 3f, 4f,
|
||||
5f, 6f, 7f, 8f,
|
||||
|
|
Loading…
Reference in a new issue