#[allow(missing_doc)]; // we allow missing to avoid having to document the mij components. use std::cast; use std::num::{One, Zero}; use std::cmp::ApproxEq; use std::vec::{VecIterator, VecMutIterator}; use vec::{Vec1, Vec2, Vec3, Vec4, Vec5, Vec6, Outer}; // traits pub use traits::mat::Mat; pub use traits::absolute::Absolute; pub use traits::dim::Dim; pub use traits::indexable::Indexable; pub use traits::iterable::{Iterable, IterableMut}; pub use traits::scalar_op::{ScalarSub, ScalarAdd}; pub use traits::mat_cast::MatCast; pub use traits::column::Column; pub use traits::inv::Inv; pub use traits::rlmul::{RMul, LMul}; pub use traits::rotation::{Rotation, RotationMatrix, Rotate}; pub use traits::transformation::{Transformation, Transform}; pub use traits::translation::{Translation, Translate}; pub use traits::transpose::{Transpose}; pub use traits::homogeneous::{ToHomogeneous, FromHomogeneous}; pub use traits::row::Row; pub use traits::col::Col; pub use traits::comp::rotation_with_translation::RotationWithTranslation; pub use traits::comp::absolute_rotate::AbsoluteRotate; // structs pub use dmat::DMat; mod mat_macros; /// Special identity matrix. All its operation are no-ops. #[deriving(Eq, Encodable, Decodable, Clone, DeepClone, Rand, Zero, ToStr)] pub struct Identity { unused: uint // XXX: zero-sized structures ICE when used cross-crate. } impl Identity { /// Creates a new identity matrix. #[inline] pub fn new() -> Identity { Identity { unused: 0 } } } /// Square matrix of dimension 1. #[deriving(Eq, Encodable, Decodable, Clone, DeepClone, IterBytes, Rand, Zero, ToStr)] pub struct Mat1 { m11: N } mat_impl!(Mat1, m11) mat_cast_impl!(Mat1, m11) add_impl!(Mat1, m11) sub_impl!(Mat1, m11) scalar_mul_impl!(Mat1, m11) scalar_div_impl!(Mat1, m11) scalar_add_impl!(Mat1, m11) scalar_sub_impl!(Mat1, m11) absolute_impl!(Mat1, m11) one_impl!(Mat1, One::one) iterable_impl!(Mat1, 1) iterable_mut_impl!(Mat1, 1) at_fast_impl!(Mat1, 1) dim_impl!(Mat1, 1) indexable_impl!(Mat1, 1) mul_impl!(Mat1, 1) rmul_impl!(Mat1, Vec1, 1) lmul_impl!(Mat1, Vec1, 1) transform_impl!(Mat1, Vec1) // (specialized) inv_impl!(Mat1, 1) transpose_impl!(Mat1, 1) approx_eq_impl!(Mat1) column_impl!(Mat1, Vec1, 1) row_impl!(Mat1, Vec1, 1) col_impl!(Mat1, Vec1, 1) to_homogeneous_impl!(Mat1, Mat2, 1, 2) from_homogeneous_impl!(Mat1, Mat2, 1, 2) outer_impl!(Vec1, Mat1) /// Square matrix of dimension 2. #[deriving(Eq, Encodable, Decodable, Clone, DeepClone, IterBytes, Rand, Zero, ToStr)] pub struct Mat2 { m11: N, m12: N, m21: N, m22: N } mat_impl!(Mat2, m11, m12, m21, m22) mat_cast_impl!(Mat2, m11, m12, m21, m22) add_impl!(Mat2, m11, m12, m21, m22) sub_impl!(Mat2, m11, m12, m21, m22) scalar_mul_impl!(Mat2, m11, m12, m21, m22) scalar_div_impl!(Mat2, m11, m12, m21, m22) scalar_add_impl!(Mat2, m11, m12, m21, m22) scalar_sub_impl!(Mat2, m11, m12, m21, m22) absolute_impl!(Mat2, m11, m12, m21, m22) one_impl!(Mat2, One::one, Zero::zero, Zero::zero, One::one) iterable_impl!(Mat2, 2) iterable_mut_impl!(Mat2, 2) dim_impl!(Mat2, 2) indexable_impl!(Mat2, 2) at_fast_impl!(Mat2, 2) // (specialized) mul_impl!(Mat2, 2) // (specialized) rmul_impl!(Mat2, Vec2, 2) // (specialized) lmul_impl!(Mat2, Vec2, 2) transform_impl!(Mat2, Vec2) // (specialized) inv_impl!(Mat2, 2) transpose_impl!(Mat2, 2) approx_eq_impl!(Mat2) column_impl!(Mat2, Vec2, 2) row_impl!(Mat2, Vec2, 2) col_impl!(Mat2, Vec2, 2) to_homogeneous_impl!(Mat2, Mat3, 2, 3) from_homogeneous_impl!(Mat2, Mat3, 2, 3) outer_impl!(Vec2, Mat2) /// Square matrix of dimension 3. #[deriving(Eq, Encodable, Decodable, Clone, DeepClone, IterBytes, Rand, Zero, ToStr)] pub struct Mat3 { m11: N, m12: N, m13: N, m21: N, m22: N, m23: N, m31: N, m32: N, m33: N } mat_impl!(Mat3, m11, m12, m13, m21, m22, m23, m31, m32, m33) mat_cast_impl!(Mat3, m11, m12, m13, m21, m22, m23, m31, m32, m33) add_impl!(Mat3, m11, m12, m13, m21, m22, m23, m31, m32, m33) sub_impl!(Mat3, m11, m12, m13, m21, m22, m23, m31, m32, m33) scalar_mul_impl!(Mat3, m11, m12, m13, m21, m22, m23, m31, m32, m33) scalar_div_impl!(Mat3, m11, m12, m13, m21, m22, m23, m31, m32, m33) scalar_add_impl!(Mat3, m11, m12, m13, m21, m22, m23, m31, m32, m33) scalar_sub_impl!(Mat3, m11, m12, m13, m21, m22, m23, m31, m32, m33) absolute_impl!(Mat3, m11, m12, m13, m21, m22, m23, m31, m32, m33) one_impl!(Mat3, One::one , Zero::zero, Zero::zero, Zero::zero, One::one , Zero::zero, Zero::zero, Zero::zero, One::one) iterable_impl!(Mat3, 3) iterable_mut_impl!(Mat3, 3) dim_impl!(Mat3, 3) indexable_impl!(Mat3, 3) at_fast_impl!(Mat3, 3) // (specialized) mul_impl!(Mat3, 3) // (specialized) rmul_impl!(Mat3, Vec3, 3) // (specialized) lmul_impl!(Mat3, Vec3, 3) transform_impl!(Mat3, Vec3) // (specialized) inv_impl!(Mat3, 3) transpose_impl!(Mat3, 3) approx_eq_impl!(Mat3) column_impl!(Mat3, Vec3, 3) // (specialized) row_impl!(Mat3, Vec3, 3) // (specialized) col_impl!(Mat3, Vec3, 3) to_homogeneous_impl!(Mat3, Mat4, 3, 4) from_homogeneous_impl!(Mat3, Mat4, 3, 4) outer_impl!(Vec3, Mat3) /// Square matrix of dimension 4. #[deriving(Eq, Encodable, Decodable, Clone, DeepClone, IterBytes, Rand, Zero, ToStr)] pub struct Mat4 { m11: N, m12: N, m13: N, m14: N, m21: N, m22: N, m23: N, m24: N, m31: N, m32: N, m33: N, m34: N, m41: N, m42: N, m43: N, m44: N } mat_impl!(Mat4, m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 ) mat_cast_impl!(Mat4, m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 ) add_impl!(Mat4, m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 ) sub_impl!(Mat4, m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 ) scalar_mul_impl!(Mat4, m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 ) scalar_div_impl!(Mat4, m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 ) scalar_add_impl!(Mat4, m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 ) scalar_sub_impl!(Mat4, m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 ) absolute_impl!(Mat4, m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44 ) one_impl!(Mat4, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one) iterable_impl!(Mat4, 4) iterable_mut_impl!(Mat4, 4) dim_impl!(Mat4, 4) indexable_impl!(Mat4, 4) at_fast_impl!(Mat4, 4) mul_impl!(Mat4, 4) rmul_impl!(Mat4, Vec4, 4) lmul_impl!(Mat4, Vec4, 4) transform_impl!(Mat4, Vec4) inv_impl!(Mat4, 4) transpose_impl!(Mat4, 4) approx_eq_impl!(Mat4) column_impl!(Mat4, Vec4, 4) row_impl!(Mat4, Vec4, 4) col_impl!(Mat4, Vec4, 4) to_homogeneous_impl!(Mat4, Mat5, 4, 5) from_homogeneous_impl!(Mat4, Mat5, 4, 5) outer_impl!(Vec4, Mat4) /// Square matrix of dimension 5. #[deriving(Eq, Encodable, Decodable, Clone, DeepClone, IterBytes, Rand, Zero, ToStr)] pub struct Mat5 { m11: N, m12: N, m13: N, m14: N, m15: N, m21: N, m22: N, m23: N, m24: N, m25: N, m31: N, m32: N, m33: N, m34: N, m35: N, m41: N, m42: N, m43: N, m44: N, m45: N, m51: N, m52: N, m53: N, m54: N, m55: N } mat_impl!(Mat5, m11, m12, m13, m14, m15, m21, m22, m23, m24, m25, m31, m32, m33, m34, m35, m41, m42, m43, m44, m45, m51, m52, m53, m54, m55 ) mat_cast_impl!(Mat5, m11, m12, m13, m14, m15, m21, m22, m23, m24, m25, m31, m32, m33, m34, m35, m41, m42, m43, m44, m45, m51, m52, m53, m54, m55 ) absolute_impl!(Mat5, m11, m12, m13, m14, m15, m21, m22, m23, m24, m25, m31, m32, m33, m34, m35, m41, m42, m43, m44, m45, m51, m52, m53, m54, m55 ) one_impl!(Mat5, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one ) add_impl!(Mat5, m11, m12, m13, m14, m15, m21, m22, m23, m24, m25, m31, m32, m33, m34, m35, m41, m42, m43, m44, m45, m51, m52, m53, m54, m55 ) sub_impl!(Mat5, m11, m12, m13, m14, m15, m21, m22, m23, m24, m25, m31, m32, m33, m34, m35, m41, m42, m43, m44, m45, m51, m52, m53, m54, m55 ) scalar_mul_impl!(Mat5, m11, m12, m13, m14, m15, m21, m22, m23, m24, m25, m31, m32, m33, m34, m35, m41, m42, m43, m44, m45, m51, m52, m53, m54, m55 ) scalar_div_impl!(Mat5, m11, m12, m13, m14, m15, m21, m22, m23, m24, m25, m31, m32, m33, m34, m35, m41, m42, m43, m44, m45, m51, m52, m53, m54, m55 ) scalar_add_impl!(Mat5, m11, m12, m13, m14, m15, m21, m22, m23, m24, m25, m31, m32, m33, m34, m35, m41, m42, m43, m44, m45, m51, m52, m53, m54, m55 ) scalar_sub_impl!(Mat5, m11, m12, m13, m14, m15, m21, m22, m23, m24, m25, m31, m32, m33, m34, m35, m41, m42, m43, m44, m45, m51, m52, m53, m54, m55 ) iterable_impl!(Mat5, 5) iterable_mut_impl!(Mat5, 5) dim_impl!(Mat5, 5) indexable_impl!(Mat5, 5) at_fast_impl!(Mat5, 5) mul_impl!(Mat5, 5) rmul_impl!(Mat5, Vec5, 5) lmul_impl!(Mat5, Vec5, 5) transform_impl!(Mat5, Vec5) inv_impl!(Mat5, 5) transpose_impl!(Mat5, 5) approx_eq_impl!(Mat5) column_impl!(Mat5, Vec5, 5) row_impl!(Mat5, Vec5, 5) col_impl!(Mat5, Vec5, 5) to_homogeneous_impl!(Mat5, Mat6, 5, 6) from_homogeneous_impl!(Mat5, Mat6, 5, 6) outer_impl!(Vec5, Mat5) /// Square matrix of dimension 6. #[deriving(Eq, Encodable, Decodable, Clone, DeepClone, IterBytes, Rand, Zero, ToStr)] pub struct Mat6 { m11: N, m12: N, m13: N, m14: N, m15: N, m16: N, m21: N, m22: N, m23: N, m24: N, m25: N, m26: N, m31: N, m32: N, m33: N, m34: N, m35: N, m36: N, m41: N, m42: N, m43: N, m44: N, m45: N, m46: N, m51: N, m52: N, m53: N, m54: N, m55: N, m56: N, m61: N, m62: N, m63: N, m64: N, m65: N, m66: N } mat_impl!(Mat6, m11, m12, m13, m14, m15, m16, m21, m22, m23, m24, m25, m26, m31, m32, m33, m34, m35, m36, m41, m42, m43, m44, m45, m46, m51, m52, m53, m54, m55, m56, m61, m62, m63, m64, m65, m66 ) mat_cast_impl!(Mat6, m11, m12, m13, m14, m15, m16, m21, m22, m23, m24, m25, m26, m31, m32, m33, m34, m35, m36, m41, m42, m43, m44, m45, m46, m51, m52, m53, m54, m55, m56, m61, m62, m63, m64, m65, m66 ) add_impl!(Mat6, m11, m12, m13, m14, m15, m16, m21, m22, m23, m24, m25, m26, m31, m32, m33, m34, m35, m36, m41, m42, m43, m44, m45, m46, m51, m52, m53, m54, m55, m56, m61, m62, m63, m64, m65, m66 ) sub_impl!(Mat6, m11, m12, m13, m14, m15, m16, m21, m22, m23, m24, m25, m26, m31, m32, m33, m34, m35, m36, m41, m42, m43, m44, m45, m46, m51, m52, m53, m54, m55, m56, m61, m62, m63, m64, m65, m66 ) scalar_mul_impl!(Mat6, m11, m12, m13, m14, m15, m16, m21, m22, m23, m24, m25, m26, m31, m32, m33, m34, m35, m36, m41, m42, m43, m44, m45, m46, m51, m52, m53, m54, m55, m56, m61, m62, m63, m64, m65, m66 ) scalar_div_impl!(Mat6, m11, m12, m13, m14, m15, m16, m21, m22, m23, m24, m25, m26, m31, m32, m33, m34, m35, m36, m41, m42, m43, m44, m45, m46, m51, m52, m53, m54, m55, m56, m61, m62, m63, m64, m65, m66 ) scalar_add_impl!(Mat6, m11, m12, m13, m14, m15, m16, m21, m22, m23, m24, m25, m26, m31, m32, m33, m34, m35, m36, m41, m42, m43, m44, m45, m46, m51, m52, m53, m54, m55, m56, m61, m62, m63, m64, m65, m66 ) scalar_sub_impl!(Mat6, m11, m12, m13, m14, m15, m16, m21, m22, m23, m24, m25, m26, m31, m32, m33, m34, m35, m36, m41, m42, m43, m44, m45, m46, m51, m52, m53, m54, m55, m56, m61, m62, m63, m64, m65, m66 ) absolute_impl!(Mat6, m11, m12, m13, m14, m15, m16, m21, m22, m23, m24, m25, m26, m31, m32, m33, m34, m35, m36, m41, m42, m43, m44, m45, m46, m51, m52, m53, m54, m55, m56, m61, m62, m63, m64, m65, m66 ) one_impl!(Mat6, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one , Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, Zero::zero, One::one ) iterable_impl!(Mat6, 6) iterable_mut_impl!(Mat6, 6) dim_impl!(Mat6, 6) indexable_impl!(Mat6, 6) at_fast_impl!(Mat6, 6) mul_impl!(Mat6, 6) rmul_impl!(Mat6, Vec6, 6) lmul_impl!(Mat6, Vec6, 6) transform_impl!(Mat6, Vec6) inv_impl!(Mat6, 6) transpose_impl!(Mat6, 6) approx_eq_impl!(Mat6) column_impl!(Mat6, Vec6, 6) row_impl!(Mat6, Vec6, 6) col_impl!(Mat6, Vec6, 6) outer_impl!(Vec6, Mat6)