From f7008b8f3be1d80cec8bb4ff089a88ed411549c7 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Tue, 27 Nov 2012 09:54:09 +1000 Subject: [PATCH] Implement inverse trigonometry functions for vector types --- src/funs/triganomic.rs | 78 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/funs/triganomic.rs b/src/funs/triganomic.rs index 3dd8a65..48648dc 100644 --- a/src/funs/triganomic.rs +++ b/src/funs/triganomic.rs @@ -131,6 +131,84 @@ pub impl float: InvTrig { #[inline(always)] pure fn atan() -> Radians { Radians(f64::atan(cast(self)).to_float()) } } +// TODO: figure out how to merge with InvTrig +pub trait InvTrigV { + pure fn asin() -> T; + pure fn acos() -> T; + pure fn atan() -> T; +} + +pub impl Vec2: InvTrigV>> { + #[inline(always)] + pure fn asin() -> Vec2> { + Vec2::new(asin(&self[0]), + asin(&self[1])) + } + + #[inline(always)] + pure fn acos() -> Vec2> { + Vec2::new(acos(&self[0]), + acos(&self[1])) + } + + #[inline(always)] + pure fn atan() -> Vec2> { + Vec2::new(atan(&self[0]), + atan(&self[1])) + } +} + +pub impl Vec3: InvTrigV>> { + #[inline(always)] + pure fn asin() -> Vec3> { + Vec3::new(asin(&self[0]), + asin(&self[1]), + asin(&self[2])) + } + + #[inline(always)] + pure fn acos() -> Vec3> { + Vec3::new(acos(&self[0]), + acos(&self[1]), + acos(&self[2])) + } + + #[inline(always)] + pure fn atan() -> Vec3> { + Vec3::new(atan(&self[0]), + atan(&self[1]), + atan(&self[2])) + } +} + +pub impl Vec4: InvTrigV>> { + #[inline(always)] + pure fn asin() -> Vec4> { + Vec4::new(asin(&self[0]), + asin(&self[1]), + asin(&self[2]), + asin(&self[3])) + } + + #[inline(always)] + pure fn acos() -> Vec4> { + Vec4::new(acos(&self[0]), + acos(&self[1]), + acos(&self[2]), + acos(&self[3])) + } + + #[inline(always)] + pure fn atan() -> Vec4> { + Vec4::new(atan(&self[0]), + atan(&self[1]), + atan(&self[2]), + atan(&self[3])) + } +} + + + /// /// Hyperbolic functions ///