ncollide3d/bounding_volume/
aabb_triangle.rs

1use crate::{
2    bounding_volume::{HasBoundingVolume, AABB},
3    math::{Isometry, Point, DIM},
4    shape::Triangle,
5};
6use na::RealField;
7
8impl<N: RealField + Copy> HasBoundingVolume<N, AABB<N>> for Triangle<N> {
9    #[inline]
10    fn bounding_volume(&self, m: &Isometry<N>) -> AABB<N> {
11        let a = m.transform_point(&self.a).coords;
12        let b = m.transform_point(&self.b).coords;
13        let c = m.transform_point(&self.c).coords;
14
15        let mut min = Point::origin();
16        let mut max = Point::origin();
17
18        for d in 0..DIM {
19            min.coords[d] = a[d].min(b[d]).min(c[d]);
20            max.coords[d] = a[d].max(b[d]).max(c[d]);
21        }
22
23        AABB::new(min, max)
24    }
25
26    #[inline]
27    fn local_bounding_volume(&self) -> AABB<N> {
28        let a = self.a.coords;
29        let b = self.b.coords;
30        let c = self.c.coords;
31
32        let mut min = Point::origin();
33        let mut max = Point::origin();
34
35        for d in 0..DIM {
36            min.coords[d] = a[d].min(b[d]).min(c[d]);
37            max.coords[d] = a[d].max(b[d]).max(c[d]);
38        }
39
40        AABB::new(min, max)
41    }
42}
43
44#[cfg(test)]
45#[cfg(feature = "dim3")]
46mod test {
47    use crate::{
48        bounding_volume::support_map_aabb,
49        math::{Isometry, Point, Translation},
50        shape::{Shape, Triangle},
51    };
52    use na::{RealField, UnitQuaternion};
53
54    #[test]
55    fn triangle_aabb_matches_support_map_aabb() {
56        let t = Triangle::new(
57            Point::new(0.3, -0.1, 0.2),
58            Point::new(-0.7, 1.0, 0.0),
59            Point::new(-0.7, 1.5, 0.0),
60        );
61
62        let m = Isometry::from_parts(
63            Translation::new(-0.2, 5.0, 0.2),
64            UnitQuaternion::from_euler_angles(0.0, f32::frac_pi_2(), 0.0),
65        );
66
67        assert_eq!(t.aabb(&m), support_map_aabb(&m, &t));
68
69        // TODO: also test local AABB once support maps have a local AABB
70        // function too
71    }
72}