diff --git a/src/angle.rs b/src/angle.rs index 76a52ce..b207a31 100644 --- a/src/angle.rs +++ b/src/angle.rs @@ -3,7 +3,7 @@ use core::f64::consts::pi; use funs::triganomic::{cos, sin}; use mat::{Mat3, Mat4}; -use num::consts::{FloatConsts, IntConsts}; +use num::ext::Float; use num::cast::{NumCast, cast}; use quat::Quat; use vec::Vec3; @@ -40,13 +40,13 @@ pub trait Angle: Add pub enum Radians = T; // FIXME: not sure why I need the Eq and Ord trait bounds, but Rust complains if I don't include them -pub impl Radians: Angle { - #[inline(always)] static pure fn full_turn() -> Radians { Radians(FloatConsts::two_pi()) } - #[inline(always)] static pure fn half_turn() -> Radians { Radians(FloatConsts::pi()) } - #[inline(always)] static pure fn quadrant() -> Radians { Radians(FloatConsts::pi_2()) } - #[inline(always)] static pure fn sextant() -> Radians { Radians(FloatConsts::pi_3()) } - #[inline(always)] static pure fn octant() -> Radians { Radians(FloatConsts::pi_4()) } - #[inline(always)] static pure fn zero() -> Radians { Radians(NumCast::zero()) } +pub impl Radians: Angle { + #[inline(always)] static pure fn full_turn() -> Radians { Radians(Float::two_pi()) } + #[inline(always)] static pure fn half_turn() -> Radians { Radians(Float::pi()) } + #[inline(always)] static pure fn quadrant() -> Radians { Radians(Float::pi_2()) } + #[inline(always)] static pure fn sextant() -> Radians { Radians(Float::pi_3()) } + #[inline(always)] static pure fn octant() -> Radians { Radians(Float::pi_4()) } + #[inline(always)] static pure fn zero() -> Radians { Radians(NumCast::zero()) } #[inline(always)] pure fn to_radians(&self) -> Radians { *self } #[inline(always)] pure fn to_degrees(&self) -> Degrees { Degrees(**self * cast(180.0 / pi)) } diff --git a/src/funs/projection.rs b/src/funs/projection.rs index d13e0d1..215ab88 100644 --- a/src/funs/projection.rs +++ b/src/funs/projection.rs @@ -1,9 +1,7 @@ use funs::triganomic::tan; use angle::Angle; use mat::Mat4; -use num::cast::cast; -use num::consts::pi; -use num::ext::FloatExt; +use num::cast::{NumCast, cast}; /** * Create a perspective projection matrix @@ -12,7 +10,7 @@ use num::ext::FloatExt; * can be found [here](http://www.opengl.org/wiki/GluPerspective_code). */ #[inline(always)] -pub pure fn perspective>(fovy: A, aspectRatio: T, near: T, far: T) -> Mat4 { +pub pure fn perspective>(fovy: A, aspectRatio: T, near: T, far: T) -> Mat4 { let ymax = near * tan(&fovy.to_radians()); let xmax = ymax * aspectRatio; @@ -26,7 +24,7 @@ pub pure fn perspective>(fovy: A, aspectRatio: T, ne * (http://www.opengl.org/sdk/docs/man2/xhtml/glFrustum.xml) function. */ #[inline(always)] -pub pure fn frustum(left: T, right: T, bottom: T, top: T, near: T, far: T) -> Mat4 { +pub pure fn frustum(left: T, right: T, bottom: T, top: T, near: T, far: T) -> Mat4 { let _0: T = cast(0); let _2: T = cast(2); diff --git a/src/num/consts.rs b/src/num/consts.rs deleted file mode 100644 index c23241d..0000000 --- a/src/num/consts.rs +++ /dev/null @@ -1,157 +0,0 @@ -pub trait IntConsts { - static pure fn zero() -> self; - static pure fn one() -> self; -} - -pub trait FloatConsts: IntConsts { - static pure fn two_pi() -> self; // 2 * π - static pure fn pi() -> self; // π - static pure fn pi_2() -> self; // π / 2 - static pure fn pi_3() -> self; // π / 3 - static pure fn pi_4() -> self; // π / 4 - static pure fn pi_6() -> self; // π / 6 - static pure fn pi_8() -> self; // π / 8 - static pure fn frac_pi_2() -> self; - static pure fn frac_pi_4() -> self; - static pure fn frac_1_pi() -> self; - static pure fn frac_2_pi() -> self; - static pure fn frac_2_sqrtpi() -> self; - static pure fn sqrt2() -> self; - static pure fn frac_1_sqrt2() -> self; - static pure fn e() -> self; - static pure fn log2_e() -> self; - static pure fn log10_e() -> self; - static pure fn ln_2() -> self; - static pure fn ln_10() -> self; -} - -pub impl u8: IntConsts { - #[inline(always)] static pure fn zero() -> u8 { 0u8 } - #[inline(always)] static pure fn one() -> u8 { 1u8 } -} - -pub impl u16: IntConsts { - #[inline(always)] static pure fn zero() -> u16 { 0u16 } - #[inline(always)] static pure fn one() -> u16 { 1u16 } -} - -pub impl u32: IntConsts { - #[inline(always)] static pure fn zero() -> u32 { 0u32 } - #[inline(always)] static pure fn one() -> u32 { 1u32 } -} - -pub impl u64: IntConsts { - #[inline(always)] static pure fn zero() -> u64 { 0u64 } - #[inline(always)] static pure fn one() -> u64 { 1u64 } -} - -pub impl uint: IntConsts { - #[inline(always)] static pure fn zero() -> uint { 0u } - #[inline(always)] static pure fn one() -> uint { 1u } -} - -pub impl i8: IntConsts { - #[inline(always)] static pure fn zero() -> i8 { 0i8 } - #[inline(always)] static pure fn one() -> i8 { 1i8 } -} - -pub impl i16: IntConsts { - #[inline(always)] static pure fn zero() -> i16 { 0i16 } - #[inline(always)] static pure fn one() -> i16 { 1i16 } -} - -pub impl i32: IntConsts { - #[inline(always)] static pure fn zero() -> i32 { 0i32 } - #[inline(always)] static pure fn one() -> i32 { 1i32 } -} - -pub impl i64: IntConsts { - #[inline(always)] static pure fn zero() -> i64 { 0i64 } - #[inline(always)] static pure fn one() -> i64 { 1i64 } -} - -pub impl int: IntConsts { - #[inline(always)] static pure fn zero() -> int { 0 } - #[inline(always)] static pure fn one() -> int { 1 } -} - -pub impl f32: IntConsts { - #[inline(always)] static pure fn zero() -> f32 { 0f32 } - #[inline(always)] static pure fn one() -> f32 { 1f32 } -} - -pub impl f32: FloatConsts { - #[inline(always)] static pure fn two_pi() -> f32 { 6.28318530717958647692528676655900576_f32 } - #[inline(always)] static pure fn pi() -> f32 { 3.14159265358979323846264338327950288_f32 } - #[inline(always)] static pure fn pi_2() -> f32 { 1.57079632679489661923132169163975144_f32 } - #[inline(always)] static pure fn pi_3() -> f32 { 1.04719755119659774615421446109316763_f32 } - #[inline(always)] static pure fn pi_4() -> f32 { 0.78539816339744830961566084581987572_f32 } - #[inline(always)] static pure fn pi_6() -> f32 { 0.52359877559829887307710723054658381_f32 } - #[inline(always)] static pure fn pi_8() -> f32 { 0.39269908169872415480783042290993786_f32 } - #[inline(always)] static pure fn frac_pi_2() -> f32 { 1.57079632679489661923132169163975144_f32 } - #[inline(always)] static pure fn frac_pi_4() -> f32 { 0.785398163397448309615660845819875721_f32 } - #[inline(always)] static pure fn frac_1_pi() -> f32 { 0.318309886183790671537767526745028724_f32 } - #[inline(always)] static pure fn frac_2_pi() -> f32 { 0.636619772367581343075535053490057448_f32 } - #[inline(always)] static pure fn frac_2_sqrtpi() -> f32 { 1.12837916709551257389615890312154517_f32 } - #[inline(always)] static pure fn sqrt2() -> f32 { 1.41421356237309504880168872420969808_f32 } - #[inline(always)] static pure fn frac_1_sqrt2() -> f32 { 0.707106781186547524400844362104849039_f32 } - #[inline(always)] static pure fn e() -> f32 { 2.71828182845904523536028747135266250_f32 } - #[inline(always)] static pure fn log2_e() -> f32 { 1.44269504088896340735992468100189214_f32 } - #[inline(always)] static pure fn log10_e() -> f32 { 0.434294481903251827651128918916605082_f32 } - #[inline(always)] static pure fn ln_2() -> f32 { 0.693147180559945309417232121458176568_f32 } - #[inline(always)] static pure fn ln_10() -> f32 { 2.30258509299404568401799145468436421_f32 } -} - -pub impl f64: IntConsts { - #[inline(always)] static pure fn zero() -> f64 { 0f64 } - #[inline(always)] static pure fn one() -> f64 { 1f64 } -} - -pub impl f64: FloatConsts { - #[inline(always)] static pure fn two_pi() -> f64 { 6.28318530717958647692528676655900576_f64 } - #[inline(always)] static pure fn pi() -> f64 { 3.14159265358979323846264338327950288_f64 } - #[inline(always)] static pure fn pi_2() -> f64 { 1.57079632679489661923132169163975144_f64 } - #[inline(always)] static pure fn pi_3() -> f64 { 1.04719755119659774615421446109316763_f64 } - #[inline(always)] static pure fn pi_4() -> f64 { 0.78539816339744830961566084581987572_f64 } - #[inline(always)] static pure fn pi_6() -> f64 { 0.52359877559829887307710723054658381_f64 } - #[inline(always)] static pure fn pi_8() -> f64 { 0.39269908169872415480783042290993786_f64 } - #[inline(always)] static pure fn frac_pi_2() -> f64 { 1.57079632679489661923132169163975144_f64 } - #[inline(always)] static pure fn frac_pi_4() -> f64 { 0.785398163397448309615660845819875721_f64 } - #[inline(always)] static pure fn frac_1_pi() -> f64 { 0.318309886183790671537767526745028724_f64 } - #[inline(always)] static pure fn frac_2_pi() -> f64 { 0.636619772367581343075535053490057448_f64 } - #[inline(always)] static pure fn frac_2_sqrtpi() -> f64 { 1.12837916709551257389615890312154517_f64 } - #[inline(always)] static pure fn sqrt2() -> f64 { 1.41421356237309504880168872420969808_f64 } - #[inline(always)] static pure fn frac_1_sqrt2() -> f64 { 0.707106781186547524400844362104849039_f64 } - #[inline(always)] static pure fn e() -> f64 { 2.71828182845904523536028747135266250_f64 } - #[inline(always)] static pure fn log2_e() -> f64 { 1.44269504088896340735992468100189214_f64 } - #[inline(always)] static pure fn log10_e() -> f64 { 0.434294481903251827651128918916605082_f64 } - #[inline(always)] static pure fn ln_2() -> f64 { 0.693147180559945309417232121458176568_f64 } - #[inline(always)] static pure fn ln_10() -> f64 { 2.30258509299404568401799145468436421_f64 } -} - -pub impl float: IntConsts { - #[inline(always)] static pure fn zero() -> float { 0f } - #[inline(always)] static pure fn one() -> float { 1f } -} - -pub impl float: FloatConsts { - #[inline(always)] static pure fn two_pi() -> float { 6.28318530717958647692528676655900576 } - #[inline(always)] static pure fn pi() -> float { 3.14159265358979323846264338327950288 } - #[inline(always)] static pure fn pi_2() -> float { 1.57079632679489661923132169163975144 } - #[inline(always)] static pure fn pi_3() -> float { 1.04719755119659774615421446109316763 } - #[inline(always)] static pure fn pi_4() -> float { 0.78539816339744830961566084581987572 } - #[inline(always)] static pure fn pi_6() -> float { 0.52359877559829887307710723054658381 } - #[inline(always)] static pure fn pi_8() -> float { 0.39269908169872415480783042290993786 } - #[inline(always)] static pure fn frac_pi_2() -> float { 1.57079632679489661923132169163975144 } - #[inline(always)] static pure fn frac_pi_4() -> float { 0.785398163397448309615660845819875721 } - #[inline(always)] static pure fn frac_1_pi() -> float { 0.318309886183790671537767526745028724 } - #[inline(always)] static pure fn frac_2_pi() -> float { 0.636619772367581343075535053490057448 } - #[inline(always)] static pure fn frac_2_sqrtpi() -> float { 1.12837916709551257389615890312154517 } - #[inline(always)] static pure fn sqrt2() -> float { 1.41421356237309504880168872420969808 } - #[inline(always)] static pure fn frac_1_sqrt2() -> float { 0.707106781186547524400844362104849039 } - #[inline(always)] static pure fn e() -> float { 2.71828182845904523536028747135266250 } - #[inline(always)] static pure fn log2_e() -> float { 1.44269504088896340735992468100189214 } - #[inline(always)] static pure fn log10_e() -> float { 0.434294481903251827651128918916605082 } - #[inline(always)] static pure fn ln_2() -> float { 0.693147180559945309417232121458176568 } - #[inline(always)] static pure fn ln_10() -> float { 2.30258509299404568401799145468436421 } -} \ No newline at end of file diff --git a/src/num/ext.rs b/src/num/ext.rs index 69c2ef8..ce3c0f6 100644 --- a/src/num/ext.rs +++ b/src/num/ext.rs @@ -1,54 +1,148 @@ use core::cmp::{Eq, Ord}; -use std::cmp::FuzzyEq; - use num::cast::*; -use num::consts::*; use num::default_eq::*; -pub trait NumExt: Copy, Eq, Num, NumCast, Ord {} +pub trait Number: Copy, Eq, Num, NumCast, Ord { + static pure fn zero() -> self; + static pure fn one() -> self; +} -pub trait UnSignedExt: NumExt {} +pub trait UnSigned /*:Number*/ {} -pub impl u8: UnSignedExt {} -pub impl u16: UnSignedExt {} -pub impl u32: UnSignedExt {} -pub impl u64: UnSignedExt {} -pub impl uint: UnSignedExt {} +pub impl u8: UnSigned {} +pub impl u16: UnSigned {} +pub impl u32: UnSigned {} +pub impl u64: UnSigned {} +pub impl uint: UnSigned {} -pub trait SignedExt: NumExt {} +pub trait Signed /*:Number*/ {} -pub impl i8: SignedExt {} -pub impl i16: SignedExt {} -pub impl i32: SignedExt {} -pub impl i64: SignedExt {} -pub impl int: SignedExt {} +pub impl i8: Signed {} +pub impl i16: Signed {} +pub impl i32: Signed {} +pub impl i64: Signed {} +pub impl int: Signed {} -pub impl f32: SignedExt {} -pub impl f64: SignedExt {} -pub impl float: SignedExt {} +pub impl f32: Signed {} +pub impl f64: Signed {} +pub impl float: Signed {} -pub trait IntegerExt: NumExt, IntConsts {} +pub trait Integer /*:Number*/ {} -pub impl u8: IntegerExt {} -pub impl u16: IntegerExt {} -pub impl u32: IntegerExt {} -pub impl u64: IntegerExt {} -pub impl uint: IntegerExt {} +pub impl u8: Integer {} +pub impl u16: Integer {} +pub impl u32: Integer {} +pub impl u64: Integer {} +pub impl uint: Integer {} -pub impl i8: IntegerExt {} -pub impl i16: IntegerExt {} -pub impl i32: IntegerExt {} -pub impl i64: IntegerExt {} -pub impl int: IntegerExt {} +pub impl i8: Integer {} +pub impl i16: Integer {} +pub impl i32: Integer {} +pub impl i64: Integer {} +pub impl int: Integer {} -pub trait FloatExt: NumExt, FloatConsts, FuzzyEq {} +pub trait Float /*:Number, FuzzyEq*/ { + pure fn to_float() -> float; + static pure fn from_float(n: float) -> self; + + static pure fn two_pi() -> self; /// 2 * π + static pure fn pi() -> self; /// π + static pure fn pi_2() -> self; /// π / 2 + static pure fn pi_3() -> self; /// π / 3 + static pure fn pi_4() -> self; /// π / 4 + static pure fn pi_6() -> self; /// π / 6 + static pure fn pi_8() -> self; /// π / 8 + static pure fn frac_pi_2() -> self; + static pure fn frac_pi_4() -> self; + static pure fn frac_1_pi() -> self; + static pure fn frac_2_pi() -> self; + static pure fn frac_2_sqrtpi() -> self; + static pure fn sqrt2() -> self; + static pure fn frac_1_sqrt2() -> self; + static pure fn e() -> self; + static pure fn log2_e() -> self; + static pure fn log10_e() -> self; + static pure fn ln_2() -> self; + static pure fn ln_10() -> self; +} -pub impl f32: FloatExt {} -pub impl f64: FloatExt {} -pub impl float: FloatExt {} \ No newline at end of file +pub impl f32: Float { + #[inline(always)] pure fn to_float() -> float { self as float } + #[inline(always)] static pure fn from_float(n: float) -> f32 { n as f32 } + + #[inline(always)] static pure fn two_pi() -> f32 { 6.28318530717958647692528676655900576_f32 } + #[inline(always)] static pure fn pi() -> f32 { 3.14159265358979323846264338327950288_f32 } + #[inline(always)] static pure fn pi_2() -> f32 { 1.57079632679489661923132169163975144_f32 } + #[inline(always)] static pure fn pi_3() -> f32 { 1.04719755119659774615421446109316763_f32 } + #[inline(always)] static pure fn pi_4() -> f32 { 0.78539816339744830961566084581987572_f32 } + #[inline(always)] static pure fn pi_6() -> f32 { 0.52359877559829887307710723054658381_f32 } + #[inline(always)] static pure fn pi_8() -> f32 { 0.39269908169872415480783042290993786_f32 } + #[inline(always)] static pure fn frac_pi_2() -> f32 { 1.57079632679489661923132169163975144_f32 } + #[inline(always)] static pure fn frac_pi_4() -> f32 { 0.785398163397448309615660845819875721_f32 } + #[inline(always)] static pure fn frac_1_pi() -> f32 { 0.318309886183790671537767526745028724_f32 } + #[inline(always)] static pure fn frac_2_pi() -> f32 { 0.636619772367581343075535053490057448_f32 } + #[inline(always)] static pure fn frac_2_sqrtpi() -> f32 { 1.12837916709551257389615890312154517_f32 } + #[inline(always)] static pure fn sqrt2() -> f32 { 1.41421356237309504880168872420969808_f32 } + #[inline(always)] static pure fn frac_1_sqrt2() -> f32 { 0.707106781186547524400844362104849039_f32 } + #[inline(always)] static pure fn e() -> f32 { 2.71828182845904523536028747135266250_f32 } + #[inline(always)] static pure fn log2_e() -> f32 { 1.44269504088896340735992468100189214_f32 } + #[inline(always)] static pure fn log10_e() -> f32 { 0.434294481903251827651128918916605082_f32 } + #[inline(always)] static pure fn ln_2() -> f32 { 0.693147180559945309417232121458176568_f32 } + #[inline(always)] static pure fn ln_10() -> f32 { 2.30258509299404568401799145468436421_f32 } +} + +pub impl f64: Float { + #[inline(always)] pure fn to_float() -> float { self as float } + #[inline(always)] static pure fn from_float(n: float) -> f64 { n as f64 } + + #[inline(always)] static pure fn two_pi() -> f64 { 6.28318530717958647692528676655900576_f64 } + #[inline(always)] static pure fn pi() -> f64 { 3.14159265358979323846264338327950288_f64 } + #[inline(always)] static pure fn pi_2() -> f64 { 1.57079632679489661923132169163975144_f64 } + #[inline(always)] static pure fn pi_3() -> f64 { 1.04719755119659774615421446109316763_f64 } + #[inline(always)] static pure fn pi_4() -> f64 { 0.78539816339744830961566084581987572_f64 } + #[inline(always)] static pure fn pi_6() -> f64 { 0.52359877559829887307710723054658381_f64 } + #[inline(always)] static pure fn pi_8() -> f64 { 0.39269908169872415480783042290993786_f64 } + #[inline(always)] static pure fn frac_pi_2() -> f64 { 1.57079632679489661923132169163975144_f64 } + #[inline(always)] static pure fn frac_pi_4() -> f64 { 0.785398163397448309615660845819875721_f64 } + #[inline(always)] static pure fn frac_1_pi() -> f64 { 0.318309886183790671537767526745028724_f64 } + #[inline(always)] static pure fn frac_2_pi() -> f64 { 0.636619772367581343075535053490057448_f64 } + #[inline(always)] static pure fn frac_2_sqrtpi() -> f64 { 1.12837916709551257389615890312154517_f64 } + #[inline(always)] static pure fn sqrt2() -> f64 { 1.41421356237309504880168872420969808_f64 } + #[inline(always)] static pure fn frac_1_sqrt2() -> f64 { 0.707106781186547524400844362104849039_f64 } + #[inline(always)] static pure fn e() -> f64 { 2.71828182845904523536028747135266250_f64 } + #[inline(always)] static pure fn log2_e() -> f64 { 1.44269504088896340735992468100189214_f64 } + #[inline(always)] static pure fn log10_e() -> f64 { 0.434294481903251827651128918916605082_f64 } + #[inline(always)] static pure fn ln_2() -> f64 { 0.693147180559945309417232121458176568_f64 } + #[inline(always)] static pure fn ln_10() -> f64 { 2.30258509299404568401799145468436421_f64 } +} + +pub impl float: Float { + #[inline(always)] pure fn to_float() -> float { self } + #[inline(always)] static pure fn from_float(n: float) -> float { n } + + #[inline(always)] static pure fn two_pi() -> float { 6.28318530717958647692528676655900576 } + #[inline(always)] static pure fn pi() -> float { 3.14159265358979323846264338327950288 } + #[inline(always)] static pure fn pi_2() -> float { 1.57079632679489661923132169163975144 } + #[inline(always)] static pure fn pi_3() -> float { 1.04719755119659774615421446109316763 } + #[inline(always)] static pure fn pi_4() -> float { 0.78539816339744830961566084581987572 } + #[inline(always)] static pure fn pi_6() -> float { 0.52359877559829887307710723054658381 } + #[inline(always)] static pure fn pi_8() -> float { 0.39269908169872415480783042290993786 } + #[inline(always)] static pure fn frac_pi_2() -> float { 1.57079632679489661923132169163975144 } + #[inline(always)] static pure fn frac_pi_4() -> float { 0.785398163397448309615660845819875721 } + #[inline(always)] static pure fn frac_1_pi() -> float { 0.318309886183790671537767526745028724 } + #[inline(always)] static pure fn frac_2_pi() -> float { 0.636619772367581343075535053490057448 } + #[inline(always)] static pure fn frac_2_sqrtpi() -> float { 1.12837916709551257389615890312154517 } + #[inline(always)] static pure fn sqrt2() -> float { 1.41421356237309504880168872420969808 } + #[inline(always)] static pure fn frac_1_sqrt2() -> float { 0.707106781186547524400844362104849039 } + #[inline(always)] static pure fn e() -> float { 2.71828182845904523536028747135266250 } + #[inline(always)] static pure fn log2_e() -> float { 1.44269504088896340735992468100189214 } + #[inline(always)] static pure fn log10_e() -> float { 0.434294481903251827651128918916605082 } + #[inline(always)] static pure fn ln_2() -> float { 0.693147180559945309417232121458176568 } + #[inline(always)] static pure fn ln_10() -> float { 2.30258509299404568401799145468436421 } +} \ No newline at end of file