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}