nphysics2d/solver/
contact_model.rs

1#![allow(missing_docs)]
2
3use downcast_rs::Downcast;
4use na::{DVector, RealField};
5use ncollide::query::ContactId;
6
7use crate::detection::ColliderContactManifold;
8use crate::material::MaterialsCoefficientsTable;
9use crate::object::{BodyHandle, BodySet, ColliderHandle};
10use crate::solver::{ConstraintSet, IntegrationParameters};
11
12/// The modeling of a contact.
13pub trait ContactModel<N: RealField + Copy, Handle: BodyHandle, CollHandle: ColliderHandle>:
14    Downcast + Send + Sync
15{
16    /// Maximum number of velocity constraint to be generated for each contact.
17    fn num_velocity_constraints(
18        &self,
19        manifold: &ColliderContactManifold<N, Handle, CollHandle>,
20    ) -> usize;
21    /// Generate all constraints for the given contact manifolds.
22    fn constraints(
23        &mut self,
24        parameters: &IntegrationParameters<N>,
25        material_coefficients: &MaterialsCoefficientsTable<N>,
26        bodies: &dyn BodySet<N, Handle = Handle>,
27        ext_vels: &DVector<N>,
28        manifolds: &[ColliderContactManifold<N, Handle, CollHandle>],
29        ground_j_id: &mut usize,
30        j_id: &mut usize,
31        jacobians: &mut [N],
32        constraints: &mut ConstraintSet<N, Handle, CollHandle, ContactId>,
33    );
34
35    /// Stores all the impulses found by the solver into a cache for warmstarting.
36    fn cache_impulses(&mut self, constraints: &ConstraintSet<N, Handle, CollHandle, ContactId>);
37}
38
39impl_downcast!(ContactModel<N, Handle, CollHandle> where N: RealField + Copy, Handle: BodyHandle, CollHandle: ColliderHandle);