ncollide3d/pipeline/narrow_phase/proximity_detector/
ball_ball_proximity_detector.rs

1use crate::math::{Isometry, Point};
2use crate::pipeline::narrow_phase::{ProximityDetector, ProximityDispatcher};
3use crate::query::{self, Proximity};
4use crate::shape::{Ball, Shape};
5use na::RealField;
6
7/// Proximity detector between two balls.
8pub struct BallBallProximityDetector {}
9
10impl Clone for BallBallProximityDetector {
11    fn clone(&self) -> BallBallProximityDetector {
12        BallBallProximityDetector {}
13    }
14}
15
16impl BallBallProximityDetector {
17    /// Creates a new persistent collision detector between two balls.
18    #[inline]
19    pub fn new() -> BallBallProximityDetector {
20        BallBallProximityDetector {}
21    }
22}
23
24impl<N: RealField + Copy> ProximityDetector<N> for BallBallProximityDetector {
25    fn update(
26        &mut self,
27        _: &dyn ProximityDispatcher<N>,
28        ma: &Isometry<N>,
29        a: &dyn Shape<N>,
30        mb: &Isometry<N>,
31        b: &dyn Shape<N>,
32        margin: N,
33    ) -> Option<Proximity> {
34        let a = a.as_shape::<Ball<N>>()?;
35        let b = b.as_shape::<Ball<N>>()?;
36        Some(query::proximity_ball_ball(
37            &Point::from(ma.translation.vector),
38            a,
39            &Point::from(mb.translation.vector),
40            b,
41            margin,
42        ))
43    }
44}