Skip to main content

auburn/col3d/detection/
collides.rs

1use super::*;
2
3/// Trait for checking collision between `Self` and `T` given relative transform between them.
4///
5/// # See also
6/// * [SymmetricBoundingBox3d]
7/// * [PenetratesRel3d]
8pub trait CollidesRel3d<T> {
9    /// Checks whether objects collide.
10    ///
11    /// # Arguments
12    /// * `t` - The object to check collision against
13    /// * `rel` - The *relative* transform from `self` to `t`
14    ///
15    /// # Example
16    /// ```
17    /// # use auburn::col3d::*;
18    /// let rel = Translate3d::from(Vec3::new(1.0, 0.0, 0.0));
19    /// let a = Box3d::with_halfdims(1.0, 1.0, 1.0);
20    /// let b = Box3d::with_halfdims(1.0, 1.0, 1.0);
21    /// assert!(a.collides_rel(&b, &rel))
22    /// ```
23    ///
24    /// # See also
25    /// * [Penetrates3d::penetrates].
26    fn collides_rel(&self, t: &T, rel: &impl Transformation3d) -> bool;
27}
28
29/// Trait for checking collision between `Self` and `T`.
30///
31/// # See also
32/// * [SymmetricBoundingBox3d]
33/// * [Penetrates3d]
34pub trait Collides3d<B, T: Transformation3d> {
35    /// Checks whether objects collide.
36    ///
37    /// # Arguments
38    /// * `transform` - Transform of `Self`
39    /// * `t` - The object to check collision against
40    /// * `delta` - Transform of `t`
41    ///
42    /// # Example
43    /// ```
44    /// # use auburn::col3d::*;
45    /// let a = Box3d::with_halfdims(1.0, 1.0, 1.0);
46    /// let a_t = Translate3d::from(Vec3::new(0.0, 0.0, 0.0));
47    /// let b = Box3d::with_halfdims(1.0, 1.0, 1.0);
48    /// let b_t = Translate3d::from(Vec3::new(1.0, 0.0, 0.0));
49    /// assert!(a.collides(&a_t, &b, &b_t))
50    /// ```
51    ///
52    /// # See also
53    /// * [Penetrates3d::penetrates].
54    fn collides(&self, transform: &T, t: &B, t_transform: &T) -> bool;
55}
56
57impl<A, B, T> Collides3d<B, T> for A
58where
59    A: CollidesRel3d<B>,
60    T: Transformation3d + DeltaTransform,
61{
62    fn collides(&self, transform: &T, t: &B, t_transform: &T) -> bool {
63        let rel = transform.delta_transform(t_transform);
64        self.collides_rel(t, &rel)
65    }
66}
67
68/// Test
69pub trait Collides3dV2<B, T: Transformation3d> {
70    fn collides_v2(self, t: &B, t_transform: &T) -> bool;
71}
72
73impl<A, B, T> Collides3dV2<B, T> for (&A, &T)
74where
75    A: CollidesRel3d<B>,
76    T: Transformation3d + DeltaTransform,
77{
78    fn collides_v2(self, t: &B, t_transform: &T) -> bool {
79        let (a, a_t) = self;
80        let rel = a_t.delta_transform(t_transform);
81        a.collides_rel(t, &rel)
82    }
83}
84
85/// Test
86pub trait Collides3dV3<B, T: Transformation3d> {
87    fn collides_v3(self, b: (&B, &T)) -> bool;
88}
89
90impl<A, B, T> Collides3dV3<B, T> for (&A, &T)
91where
92    A: CollidesRel3d<B>,
93    T: Transformation3d + DeltaTransform,
94{
95    fn collides_v3(self, b: (&B, &T)) -> bool {
96        let (a, a_t) = self;
97        let (b, b_t) = b;
98        let rel = a_t.delta_transform(b_t);
99        a.collides_rel(b, &rel)
100    }
101}