#![allow(missing_docs)]
use downcast::Any;
use na::{DVector, Real};
use detection::ColliderContactManifold;
use object::BodySet;
use solver::{ConstraintSet, IntegrationParameters};
pub trait ContactModel<N: Real>: Any + Send + Sync {
fn num_velocity_constraints(&self, manifold: &ColliderContactManifold<N>) -> usize;
fn constraints(
&mut self,
params: &IntegrationParameters<N>,
bodies: &BodySet<N>,
ext_vels: &DVector<N>,
manifolds: &[ColliderContactManifold<N>],
ground_j_id: &mut usize,
j_id: &mut usize,
jacobians: &mut [N],
constraints: &mut ConstraintSet<N>,
);
fn cache_impulses(&mut self, constraints: &ConstraintSet<N>);
}
downcast!(<N> ContactModel<N> where N: Real);