1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
use super::args::*; use crate::uses::*; pub trait TupleAllAny { fn all(self) -> bool; fn any(self) -> bool; } pub trait TupleVecIdentity: Copy + Default { fn one() -> Self; fn zero() -> Self { Def() } } pub trait Tuple2Geometry<A> { fn rotate(self, def: A) -> Self; } impl TupleAllAny for (bool, bool) { fn all(self) -> bool { self.0 && self.1 } fn any(self) -> bool { self.0 || self.1 } } impl TupleAllAny for (bool, bool, bool) { fn all(self) -> bool { self.0 && self.1 && self.2 } fn any(self) -> bool { self.0 || self.1 || self.2 } } impl TupleAllAny for (bool, bool, bool, bool) { fn all(self) -> bool { self.0 && self.1 && self.2 && self.3 } fn any(self) -> bool { self.0 || self.1 || self.2 || self.3 } } impl<T: ToZero> TupleVecIdentity for vec2<T> { fn one() -> Self { Self::to((1, 1)) } } impl<T: ToZero> TupleVecIdentity for vec3<T> { fn one() -> Self { Self::to((1, 1, 1)) } } impl<T: ToZero> TupleVecIdentity for vec4<T> { fn one() -> Self { Self::to((1, 1, 1, 1)) } } trait_set! { pub trait ToZero = Cast<u32> + Copy + Default } impl<T: TupleArg2<f32>, A> Tuple2Geometry<A> for T where f32: Cast<A>, Self: Cast<glm::Vec2>, { fn rotate(self, deg: A) -> Self { let rad = std::f32::consts::FRAC_PI_2 * f32(deg); let rot = na::Rotation2::new(rad); Self::to(rot * glm::Vec2::to(self.get2())) } }