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
#![allow(missing_docs)]
use downcast_rs::Downcast;
use na::{DVector, RealField};
use ncollide::query::ContactId;
use crate::detection::ColliderContactManifold;
use crate::material::MaterialsCoefficientsTable;
use crate::object::{BodyHandle, BodySet, ColliderHandle};
use crate::solver::{ConstraintSet, IntegrationParameters};
pub trait ContactModel<N: RealField, Handle: BodyHandle, CollHandle: ColliderHandle>:
Downcast + Send + Sync
{
fn num_velocity_constraints(
&self,
manifold: &ColliderContactManifold<N, Handle, CollHandle>,
) -> usize;
fn constraints(
&mut self,
parameters: &IntegrationParameters<N>,
material_coefficients: &MaterialsCoefficientsTable<N>,
bodies: &dyn BodySet<N, Handle = Handle>,
ext_vels: &DVector<N>,
manifolds: &[ColliderContactManifold<N, Handle, CollHandle>],
ground_j_id: &mut usize,
j_id: &mut usize,
jacobians: &mut [N],
constraints: &mut ConstraintSet<N, Handle, CollHandle, ContactId>,
);
fn cache_impulses(&mut self, constraints: &ConstraintSet<N, Handle, CollHandle, ContactId>);
}
impl_downcast!(ContactModel<N, Handle, CollHandle> where N: RealField, Handle: BodyHandle, CollHandle: ColliderHandle);