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
use crate::math::Real;
use crate::query::{
DefaultQueryDispatcher, NonlinearRigidMotion, QueryDispatcher, Unsupported, TOI,
};
use crate::shape::Shape;
/// Computes the smallest time of impact of two shapes under translational an rotational movements.
///
/// # Parameters
/// * `motion1` - The motion of the first shape.
/// * `g1` - The first shape involved in the query.
/// * `motion2` - The motion of the second shape.
/// * `g2` - The second shape involved in the query.
/// * `start_time` - The starting time of the interval where the motion takes place.
/// * `end_time` - The end time of the interval where the motion takes place.
/// * `stop_at_penetration` - If the casted shape starts in a penetration state with any
/// collider, two results are possible. If `stop_at_penetration` is `true` then, the
/// result will have a `toi` equal to `start_time`. If `stop_at_penetration` is `false`
/// then the nonlinear shape-casting will see if further motion wrt. the penetration normal
/// would result in tunnelling. If it does not (i.e. we have a separating velocity along
/// that normal) then the nonlinear shape-casting will attempt to find another impact,
/// at a time `> start_time` that could result in tunnelling.
pub fn nonlinear_time_of_impact(
motion1: &NonlinearRigidMotion,
g1: &dyn Shape,
motion2: &NonlinearRigidMotion,
g2: &dyn Shape,
start_time: Real,
end_time: Real,
stop_at_penetration: bool,
) -> Result<Option<TOI>, Unsupported> {
DefaultQueryDispatcher.nonlinear_time_of_impact(
motion1,
g1,
motion2,
g2,
start_time,
end_time,
stop_at_penetration,
)
}