Specialized Mul, RMul, and LMul for Mat2 and Mat3.
This commit is contained in:
parent
1a08262f50
commit
06c7293e83
4
Makefile
4
Makefile
|
@ -3,7 +3,7 @@ nalgebra_lib_path=lib
|
||||||
nalgebra_doc_path=doc
|
nalgebra_doc_path=doc
|
||||||
all:
|
all:
|
||||||
mkdir -p $(nalgebra_lib_path)
|
mkdir -p $(nalgebra_lib_path)
|
||||||
rust build src/lib.rs --out-dir $(nalgebra_lib_path) --opt-level 2
|
rust build src/lib.rs --out-dir $(nalgebra_lib_path) --opt-level 3
|
||||||
|
|
||||||
test:
|
test:
|
||||||
mkdir -p $(nalgebra_lib_path)
|
mkdir -p $(nalgebra_lib_path)
|
||||||
|
@ -11,7 +11,7 @@ test:
|
||||||
rm libtest~
|
rm libtest~
|
||||||
|
|
||||||
bench:
|
bench:
|
||||||
rustc --test src/lib.rs --opt-level 2 -o bench~ && ./bench~ --bench
|
rustc --test src/lib.rs --opt-level 3 -o bench~ && ./bench~ --bench
|
||||||
rm bench~
|
rm bench~
|
||||||
|
|
||||||
doc:
|
doc:
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#[deny(non_uppercase_statics)];
|
#[deny(non_uppercase_statics)];
|
||||||
#[deny(unnecessary_qualification)];
|
#[deny(unnecessary_qualification)];
|
||||||
#[deny(missing_doc)];
|
#[deny(missing_doc)];
|
||||||
#[deny(warnings)];
|
|
||||||
|
|
||||||
extern mod std;
|
extern mod std;
|
||||||
extern mod extra;
|
extern mod extra;
|
||||||
|
|
12
src/mat.rs
12
src/mat.rs
|
@ -115,9 +115,9 @@ iterable_mut_impl!(Mat2, 2)
|
||||||
dim_impl!(Mat2, 2)
|
dim_impl!(Mat2, 2)
|
||||||
indexable_impl!(Mat2, 2)
|
indexable_impl!(Mat2, 2)
|
||||||
at_fast_impl!(Mat2, 2)
|
at_fast_impl!(Mat2, 2)
|
||||||
mul_impl!(Mat2, 2)
|
// (specialized) mul_impl!(Mat2, 2)
|
||||||
rmul_impl!(Mat2, Vec2, 2)
|
// (specialized) rmul_impl!(Mat2, Vec2, 2)
|
||||||
lmul_impl!(Mat2, Vec2, 2)
|
// (specialized) lmul_impl!(Mat2, Vec2, 2)
|
||||||
transform_impl!(Mat2, Vec2)
|
transform_impl!(Mat2, Vec2)
|
||||||
// (specialized) inv_impl!(Mat2, 2)
|
// (specialized) inv_impl!(Mat2, 2)
|
||||||
transpose_impl!(Mat2, 2)
|
transpose_impl!(Mat2, 2)
|
||||||
|
@ -172,9 +172,9 @@ iterable_mut_impl!(Mat3, 3)
|
||||||
dim_impl!(Mat3, 3)
|
dim_impl!(Mat3, 3)
|
||||||
indexable_impl!(Mat3, 3)
|
indexable_impl!(Mat3, 3)
|
||||||
at_fast_impl!(Mat3, 3)
|
at_fast_impl!(Mat3, 3)
|
||||||
mul_impl!(Mat3, 3)
|
// (specialized) mul_impl!(Mat3, 3)
|
||||||
rmul_impl!(Mat3, Vec3, 3)
|
// (specialized) rmul_impl!(Mat3, Vec3, 3)
|
||||||
lmul_impl!(Mat3, Vec3, 3)
|
// (specialized) lmul_impl!(Mat3, Vec3, 3)
|
||||||
transform_impl!(Mat3, Vec3)
|
transform_impl!(Mat3, Vec3)
|
||||||
// (specialized) inv_impl!(Mat3, 3)
|
// (specialized) inv_impl!(Mat3, 3)
|
||||||
transpose_impl!(Mat3, 3)
|
transpose_impl!(Mat3, 3)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use std::num::{Zero, One};
|
use std::num::{Zero, One};
|
||||||
use vec::Vec3;
|
use vec::{Vec2, Vec3};
|
||||||
use mat::{Mat1, Mat2, Mat3, Inv, Row, Col};
|
use mat::{Mat1, Mat2, Mat3, Inv, Row, Col, RMul, LMul};
|
||||||
use mat;
|
use mat;
|
||||||
|
|
||||||
// some specializations:
|
// some specializations:
|
||||||
|
@ -189,6 +189,80 @@ impl<N: Clone> Col<Vec3<N>> for Mat3<N> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<N: Mul<N, N> + Add<N, N>> Mul<Mat3<N>, Mat3<N>> for Mat3<N> {
|
||||||
|
#[inline]
|
||||||
|
fn mul(&self, other: &Mat3<N>) -> Mat3<N> {
|
||||||
|
Mat3::new(
|
||||||
|
self.m11 * other.m11 + self.m12 * other.m21 + self.m13 * other.m31,
|
||||||
|
self.m11 * other.m12 + self.m12 * other.m22 + self.m13 * other.m32,
|
||||||
|
self.m11 * other.m13 + self.m12 * other.m23 + self.m13 * other.m33,
|
||||||
|
|
||||||
|
self.m21 * other.m11 + self.m22 * other.m21 + self.m23 * other.m31,
|
||||||
|
self.m21 * other.m12 + self.m22 * other.m22 + self.m23 * other.m32,
|
||||||
|
self.m21 * other.m13 + self.m22 * other.m23 + self.m23 * other.m33,
|
||||||
|
|
||||||
|
self.m31 * other.m11 + self.m32 * other.m21 + self.m33 * other.m31,
|
||||||
|
self.m31 * other.m12 + self.m32 * other.m22 + self.m33 * other.m32,
|
||||||
|
self.m31 * other.m13 + self.m32 * other.m23 + self.m33 * other.m33
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<N: Mul<N, N> + Add<N, N>> Mul<Mat2<N>, Mat2<N>> for Mat2<N> {
|
||||||
|
#[inline(always)]
|
||||||
|
fn mul(&self, other: &Mat2<N>) -> Mat2<N> {
|
||||||
|
Mat2::new(
|
||||||
|
self.m11 * other.m11 + self.m12 * other.m21,
|
||||||
|
self.m11 * other.m12 + self.m12 * other.m22,
|
||||||
|
|
||||||
|
self.m21 * other.m11 + self.m22 * other.m21,
|
||||||
|
self.m21 * other.m12 + self.m22 * other.m22
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<N: Mul<N, N> + Add<N, N>> RMul<Vec3<N>> for Mat3<N> {
|
||||||
|
#[inline(always)]
|
||||||
|
fn rmul(&self, v: &Vec3<N>) -> Vec3<N> {
|
||||||
|
Vec3::new(
|
||||||
|
self.m11 * v.x + self.m12 * v.y + self.m13 * v.z,
|
||||||
|
self.m21 * v.x + self.m22 * v.y + self.m23 * v.z,
|
||||||
|
self.m31 * v.x + self.m32 * v.y + self.m33 * v.z
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<N: Mul<N, N> + Add<N, N>> LMul<Vec3<N>> for Mat3<N> {
|
||||||
|
#[inline(always)]
|
||||||
|
fn lmul(&self, v: &Vec3<N>) -> Vec3<N> {
|
||||||
|
Vec3::new(
|
||||||
|
self.m11 * v.x + self.m21 * v.y + self.m31 * v.z,
|
||||||
|
self.m12 * v.x + self.m22 * v.y + self.m32 * v.z,
|
||||||
|
self.m13 * v.x + self.m23 * v.y + self.m33 * v.z
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<N: Mul<N, N> + Add<N, N>> RMul<Vec2<N>> for Mat2<N> {
|
||||||
|
#[inline(always)]
|
||||||
|
fn rmul(&self, v: &Vec2<N>) -> Vec2<N> {
|
||||||
|
Vec2::new(
|
||||||
|
self.m11 * v.x + self.m12 * v.y,
|
||||||
|
self.m21 * v.x + self.m22 * v.y
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<N: Mul<N, N> + Add<N, N>> LMul<Vec2<N>> for Mat2<N> {
|
||||||
|
#[inline(always)]
|
||||||
|
fn lmul(&self, v: &Vec2<N>) -> Vec2<N> {
|
||||||
|
Vec2::new(
|
||||||
|
self.m11 * v.x + self.m21 * v.y,
|
||||||
|
self.m12 * v.x + self.m22 * v.y
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: move this to another file?
|
// FIXME: move this to another file?
|
||||||
impl<N: Real + NumCast + Zero + One> mat::Mat4<N> {
|
impl<N: Real + NumCast + Zero + One> mat::Mat4<N> {
|
||||||
/// Computes a projection matrix given the frustrum near plane width, height, the field of
|
/// Computes a projection matrix given the frustrum near plane width, height, the field of
|
||||||
|
|
|
@ -219,7 +219,9 @@ macro_rules! basis_impl(
|
||||||
for i in range(0u, $dim) {
|
for i in range(0u, $dim) {
|
||||||
let mut basis_element : $t<N> = Zero::zero();
|
let mut basis_element : $t<N> = Zero::zero();
|
||||||
|
|
||||||
basis_element.set(i, One::one());
|
unsafe {
|
||||||
|
basis_element.set_fast(i, One::one());
|
||||||
|
}
|
||||||
|
|
||||||
if !f(basis_element) { return }
|
if !f(basis_element) { return }
|
||||||
}
|
}
|
||||||
|
@ -234,7 +236,9 @@ macro_rules! basis_impl(
|
||||||
for i in range(0u, $dim) {
|
for i in range(0u, $dim) {
|
||||||
let mut basis_element : $t<N> = Zero::zero();
|
let mut basis_element : $t<N> = Zero::zero();
|
||||||
|
|
||||||
basis_element.set(i, One::one());
|
unsafe {
|
||||||
|
basis_element.set_fast(i, One::one());
|
||||||
|
}
|
||||||
|
|
||||||
if basis.len() == $dim - 1 {
|
if basis.len() == $dim - 1 {
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue