use super::*;
pub trait CollidesRel3d<T> {
fn collides_rel(&self, t: &T, rel: &impl Transformation3d) -> bool;
}
pub trait Collides3d<B, T: Transformation3d> {
fn collides(&self, transform: &T, t: &B, t_transform: &T) -> bool;
}
impl<A, B, T> Collides3d<B, T> for A
where
A: CollidesRel3d<B>,
T: Transformation3d + 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 Collides3dV2<B, T: Transformation3d> {
fn collides_v2(self, t: &B, t_transform: &T) -> bool;
}
impl<A, B, T> Collides3dV2<B, T> for (&A, &T)
where
A: CollidesRel3d<B>,
T: Transformation3d + 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 Collides3dV3<B, T: Transformation3d> {
fn collides_v3(self, b: (&B, &T)) -> bool;
}
impl<A, B, T> Collides3dV3<B, T> for (&A, &T)
where
A: CollidesRel3d<B>,
T: Transformation3d + 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)
}
}