nphysics2d/solver/
contact_model.rs1#![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
12pub trait ContactModel<N: RealField + Copy, Handle: BodyHandle, CollHandle: ColliderHandle>:
14 Downcast + Send + Sync
15{
16 fn num_velocity_constraints(
18 &self,
19 manifold: &ColliderContactManifold<N, Handle, CollHandle>,
20 ) -> usize;
21 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 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);