ncollide3d/pipeline/object/query_type.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
use crate::query::ContactPrediction;
use na::RealField;
/// The kind of query a CollisionObject may be involved on.
///
/// The following queries are executed for a given pair of `GeometricQueryType` associated with two
/// collision objects:
///
/// * Contacts + Contacts = exact contact point coputation.
/// * Contacts + Proximity = proximity test only.
/// * Proximity + Proximity = proximity test only.
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum GeometricQueryType<N: RealField + Copy> {
/// This objects can respond to both contact point computation and proximity queries.
Contacts(N, N),
/// This object can respond to proximity tests only.
Proximity(N),
// FIXME: not yet implemented: Distance
}
impl<N: RealField + Copy> GeometricQueryType<N> {
/// The numerical distance limit of relevance for this query.
///
/// If two objects are separated by a distance greater than the sum of their respective
/// `query_limit`, the corresponding query will not by performed. For proximity queries,
/// non-intersecting object closer than a distance equal to the sum of their `query_limit` will
/// be reported as `Proximity::WithinMargin`.
#[inline]
pub fn query_limit(&self) -> N {
match *self {
GeometricQueryType::Contacts(ref val, _) => *val,
GeometricQueryType::Proximity(ref val) => *val,
}
}
/// Given two contact query types, returns the corresponding contact prediction parameters.
///
/// Returns `None` if any of `self` or `other` is not a `GeometricQueryType::Contacts`.
pub fn contact_queries_to_prediction(self, other: Self) -> Option<ContactPrediction<N>> {
match (self, other) {
(
GeometricQueryType::Contacts(linear1, angular1),
GeometricQueryType::Contacts(linear2, angular2),
) => Some(ContactPrediction::new(
linear1 + linear2,
angular1,
angular2,
)),
_ => None,
}
}
/// Returns `true` if this is a contacts query type.
#[inline]
pub fn is_contacts_query(&self) -> bool {
if let GeometricQueryType::Contacts(..) = *self {
true
} else {
false
}
}
/// Returns `true` if this is a proximity query type.
#[inline]
pub fn is_proximity_query(&self) -> bool {
if let GeometricQueryType::Proximity(_) = *self {
true
} else {
false
}
}
}