aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/contact_generator
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2020-10-27 13:36:53 +0100
committerCrozet Sébastien <developer@crozet.re>2020-10-27 14:35:01 +0100
commitcb6a7ff9468347735ef63db9a9e38faeb476981b (patch)
tree49f3a20afbd5a3be4c3d9de25f630f6b353e6406 /src/geometry/contact_generator
parent3def91d62eba6ca2486fdaa386f78d82923c705a (diff)
downloadrapier-cb6a7ff9468347735ef63db9a9e38faeb476981b.tar.gz
rapier-cb6a7ff9468347735ef63db9a9e38faeb476981b.tar.bz2
rapier-cb6a7ff9468347735ef63db9a9e38faeb476981b.zip
Add solver flags for controlling whether or not some contacts should be taken into account by the constraints solver.
Diffstat (limited to 'src/geometry/contact_generator')
-rw-r--r--src/geometry/contact_generator/contact_generator.rs14
-rw-r--r--src/geometry/contact_generator/heightfield_shape_contact_generator.rs11
-rw-r--r--src/geometry/contact_generator/trimesh_shape_contact_generator.rs1
3 files changed, 20 insertions, 6 deletions
diff --git a/src/geometry/contact_generator/contact_generator.rs b/src/geometry/contact_generator/contact_generator.rs
index b034760..728794d 100644
--- a/src/geometry/contact_generator/contact_generator.rs
+++ b/src/geometry/contact_generator/contact_generator.rs
@@ -1,5 +1,6 @@
use crate::geometry::{
Collider, ColliderSet, ContactDispatcher, ContactEvent, ContactManifold, ContactPair, Shape,
+ SolverFlags,
};
use crate::math::Isometry;
#[cfg(feature = "simd-is-enabled")]
@@ -26,8 +27,9 @@ impl ContactPhase {
Self::NearPhase(gen) => (gen.generate_contacts)(&mut context),
Self::ExactPhase(gen) => {
// Build the primitive context from the non-primitive context and dispatch.
- let (collider1, collider2, manifold, workspace) =
- context.pair.single_manifold(context.colliders);
+ let (collider1, collider2, manifold, workspace) = context
+ .pair
+ .single_manifold(context.colliders, context.solver_flags);
let mut context2 = PrimitiveContactGenerationContext {
prediction_distance: context.prediction_distance,
collider1,
@@ -85,9 +87,11 @@ impl ContactPhase {
[Option<&mut (dyn Any + Send + Sync)>; SIMD_WIDTH],
> = ArrayVec::new();
- for pair in context.pairs.iter_mut() {
+ for (pair, solver_flags) in
+ context.pairs.iter_mut().zip(context.solver_flags.iter())
+ {
let (collider1, collider2, manifold, workspace) =
- pair.single_manifold(context.colliders);
+ pair.single_manifold(context.colliders, *solver_flags);
colliders_arr.push((collider1, collider2));
manifold_arr.push(manifold);
workspace_arr.push(workspace);
@@ -188,6 +192,7 @@ pub struct ContactGenerationContext<'a> {
pub prediction_distance: f32,
pub colliders: &'a ColliderSet,
pub pair: &'a mut ContactPair,
+ pub solver_flags: SolverFlags,
}
#[cfg(feature = "simd-is-enabled")]
@@ -196,6 +201,7 @@ pub struct ContactGenerationContextSimd<'a, 'b> {
pub prediction_distance: f32,
pub colliders: &'a ColliderSet,
pub pairs: &'a mut [&'b mut ContactPair],
+ pub solver_flags: &'a [SolverFlags],
}
#[derive(Copy, Clone)]
diff --git a/src/geometry/contact_generator/heightfield_shape_contact_generator.rs b/src/geometry/contact_generator/heightfield_shape_contact_generator.rs
index 9224d4e..f291fa0 100644
--- a/src/geometry/contact_generator/heightfield_shape_contact_generator.rs
+++ b/src/geometry/contact_generator/heightfield_shape_contact_generator.rs
@@ -104,6 +104,7 @@ fn do_generate_contacts(
let manifolds = &mut ctxt.pair.manifolds;
let prediction_distance = ctxt.prediction_distance;
let dispatcher = ctxt.dispatcher;
+ let solver_flags = ctxt.solver_flags;
let shape_type2 = collider2.shape().shape_type();
heightfield1.map_elements_in_local_aabb(&ls_aabb2, &mut |i, part1, _| {
@@ -131,8 +132,14 @@ fn do_generate_contacts(
timestamp: new_timestamp,
workspace: workspace2,
};
- let manifold =
- ContactManifold::with_subshape_indices(coll_pair, collider1, collider2, i, 0);
+ let manifold = ContactManifold::with_subshape_indices(
+ coll_pair,
+ collider1,
+ collider2,
+ i,
+ 0,
+ solver_flags,
+ );
manifolds.push(manifold);
entry.insert(sub_detector)
diff --git a/src/geometry/contact_generator/trimesh_shape_contact_generator.rs b/src/geometry/contact_generator/trimesh_shape_contact_generator.rs
index 502658d..9474516 100644
--- a/src/geometry/contact_generator/trimesh_shape_contact_generator.rs
+++ b/src/geometry/contact_generator/trimesh_shape_contact_generator.rs
@@ -149,6 +149,7 @@ fn do_generate_contacts(
collider2,
*triangle_id,
0,
+ ctxt.solver_flags,
)
} else {
// We already have a manifold for this triangle.