use super::*;
pub trait CollidesRel2d<T> {
fn collides_rel(&self, t: &T, rel: &impl Transformation2d) -> bool;
}
pub trait Collides2d<B, T: Transformation2d> {
fn collides(&self, transform: &T, t: &B, t_transform: &T) -> bool;
}
impl<A, B, T> Collides2d<B, T> for A
where
A: CollidesRel2d<B>,
T: Transformation2d + DeltaTransform,
{
fn collides(&self, transform: &T, t: &B, t_transform: &T) -> bool {
let rel = transform.delta_transform(t_transform);
self.collides_rel(t, &rel)
}
}
pub trait Collides2dV2<B, T: Transformation2d> {
fn collides_v2(self, t: &B, t_transform: &T) -> bool;
}
impl<A, B, T> Collides2dV2<B, T> for (&A, &T)
where
A: CollidesRel2d<B>,
T: Transformation2d + DeltaTransform,
{
fn collides_v2(self, t: &B, t_transform: &T) -> bool {
let (a, a_t) = self;
let rel = a_t.delta_transform(t_transform);
a.collides_rel(t, &rel)
}
}
pub trait Collides2dV3<B, T: Transformation2d> {
fn collides_v3(self, b: (&B, &T)) -> bool;
}
impl<A, B, T> Collides2dV3<B, T> for (&A, &T)
where
A: CollidesRel2d<B>,
T: Transformation2d + DeltaTransform,
{
fn collides_v3(self, b: (&B, &T)) -> bool {
let (a, a_t) = self;
let (b, b_t) = b;
let rel = a_t.delta_transform(b_t);
a.collides_rel(b, &rel)
}
}