aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/narrow_phase.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2022-04-19 18:57:40 +0200
committerSébastien Crozet <sebastien@crozet.re>2022-04-20 19:02:49 +0200
commit2b1374c596957ac8cabe085859be3b823a1ba0c6 (patch)
treea7f37ec29199a5a2c6198a6b001e665524fdab96 /src/geometry/narrow_phase.rs
parentee679427cda6363e4de94a59e293d01133a44d1f (diff)
downloadrapier-2b1374c596957ac8cabe085859be3b823a1ba0c6.tar.gz
rapier-2b1374c596957ac8cabe085859be3b823a1ba0c6.tar.bz2
rapier-2b1374c596957ac8cabe085859be3b823a1ba0c6.zip
First round deleting the component sets.
Diffstat (limited to 'src/geometry/narrow_phase.rs')
-rw-r--r--src/geometry/narrow_phase.rs142
1 files changed, 40 insertions, 102 deletions
diff --git a/src/geometry/narrow_phase.rs b/src/geometry/narrow_phase.rs
index d737bfc..26bddf1 100644
--- a/src/geometry/narrow_phase.rs
+++ b/src/geometry/narrow_phase.rs
@@ -1,16 +1,16 @@
#[cfg(feature = "parallel")]
use rayon::prelude::*;
-use crate::data::{BundleSet, Coarena, ComponentSet, ComponentSetMut, ComponentSetOption};
-use crate::dynamics::CoefficientCombineRule;
+use crate::data::Coarena;
use crate::dynamics::{
- IslandManager, RigidBodyActivation, RigidBodyDominance, RigidBodyIds, RigidBodyType,
+ CoefficientCombineRule, IslandManager, RigidBodyActivation, RigidBodyDominance, RigidBodyIds,
+ RigidBodySet, RigidBodyType,
};
use crate::geometry::{
BroadPhasePairEvent, ColliderChanges, ColliderGraphIndex, ColliderHandle, ColliderMaterial,
- ColliderPair, ColliderParent, ColliderPosition, ColliderShape, ColliderType, CollisionEvent,
- ContactData, ContactManifold, ContactManifoldData, ContactPair, InteractionGraph,
- IntersectionPair, SolverContact, SolverFlags,
+ ColliderPair, ColliderParent, ColliderPosition, ColliderSet, ColliderShape, ColliderType,
+ CollisionEvent, ContactData, ContactManifold, ContactManifoldData, ContactPair,
+ InteractionGraph, IntersectionPair, SolverContact, SolverFlags,
};
use crate::math::{Real, Vector};
use crate::pipeline::{
@@ -250,23 +250,15 @@ impl NarrowPhase {
// }
/// Maintain the narrow-phase internal state by taking collider removal into account.
- pub fn handle_user_changes<Bodies, Colliders>(
+ pub fn handle_user_changes(
&mut self,
mut islands: Option<&mut IslandManager>,
modified_colliders: &[ColliderHandle],
removed_colliders: &[ColliderHandle],
- colliders: &mut Colliders,
- bodies: &mut Bodies,
+ colliders: &mut ColliderSet,
+ bodies: &mut RigidBodySet,
events: &dyn EventHandler,
- ) where
- Bodies: ComponentSetMut<RigidBodyActivation>
- + ComponentSet<RigidBodyType>
- + ComponentSetMut<RigidBodyIds>,
- Colliders: ComponentSet<ColliderChanges>
- + ComponentSet<ColliderType>
- + ComponentSet<ColliderFlags>
- + ComponentSetOption<ColliderParent>,
- {
+ ) {
// TODO: avoid these hash-maps.
// They are necessary to handle the swap-remove done internally
// by the contact/intersection graphs when a node is removed.
@@ -305,22 +297,17 @@ impl NarrowPhase {
self.handle_modified_colliders(islands, modified_colliders, colliders, bodies, events);
}
- pub(crate) fn remove_collider<Bodies, Colliders>(
+ pub(crate) fn remove_collider(
&mut self,
intersection_graph_id: ColliderGraphIndex,
contact_graph_id: ColliderGraphIndex,
mut islands: Option<&mut IslandManager>,
- colliders: &mut Colliders,
- bodies: &mut Bodies,
+ colliders: &mut ColliderSet,
+ bodies: &mut RigidBodySet,
prox_id_remap: &mut HashMap<ColliderHandle, ColliderGraphIndex>,
contact_id_remap: &mut HashMap<ColliderHandle, ColliderGraphIndex>,
events: &dyn EventHandler,
- ) where
- Bodies: ComponentSetMut<RigidBodyActivation>
- + ComponentSet<RigidBodyType>
- + ComponentSetMut<RigidBodyIds>,
- Colliders: ComponentSetOption<ColliderParent>,
- {
+ ) {
// Wake up every body in contact with the deleted collider and generate Stopped collision events.
if let Some(islands) = islands.as_deref_mut() {
for (a, b, pair) in self.contact_graph.interactions_with(contact_graph_id) {
@@ -379,22 +366,14 @@ impl NarrowPhase {
}
}
- pub(crate) fn handle_modified_colliders<Bodies, Colliders>(
+ pub(crate) fn handle_modified_colliders(
&mut self,
mut islands: Option<&mut IslandManager>,
modified_colliders: &[ColliderHandle],
- colliders: &Colliders,
- bodies: &mut Bodies,
+ colliders: &ColliderSet,
+ bodies: &mut RigidBodySet,
events: &dyn EventHandler,
- ) where
- Bodies: ComponentSetMut<RigidBodyActivation>
- + ComponentSet<RigidBodyType>
- + ComponentSetMut<RigidBodyIds>,
- Colliders: ComponentSet<ColliderChanges>
- + ComponentSet<ColliderType>
- + ComponentSet<ColliderFlags>
- + ComponentSetOption<ColliderParent>,
- {
+ ) {
let mut pairs_to_remove = vec![];
for handle in modified_colliders {
@@ -496,22 +475,15 @@ impl NarrowPhase {
}
}
- fn remove_pair<Bodies, Colliders>(
+ fn remove_pair(
&mut self,
islands: Option<&mut IslandManager>,
- colliders: &Colliders,
- bodies: &mut Bodies,
+ colliders: &ColliderSet,
+ bodies: &mut RigidBodySet,
pair: &ColliderPair,
events: &dyn EventHandler,
mode: PairRemovalMode,
- ) where
- Bodies: ComponentSetMut<RigidBodyActivation>
- + ComponentSet<RigidBodyType>
- + ComponentSetMut<RigidBodyIds>,
- Colliders: ComponentSet<ColliderType>
- + ComponentSet<ColliderFlags>
- + ComponentSetOption<ColliderParent>,
- {
+ ) {
let co_type1: Option<&ColliderType> = colliders.get(pair.collider1.0);
let co_type2: Option<&ColliderType> = colliders.get(pair.collider2.0);
@@ -582,10 +554,7 @@ impl NarrowPhase {
}
}
- fn add_pair<Colliders>(&mut self, colliders: &Colliders, pair: &ColliderPair)
- where
- Colliders: ComponentSet<ColliderType> + ComponentSetOption<ColliderParent>,
- {
+ fn add_pair(&mut self, colliders: &ColliderSet, pair: &ColliderPair) {
let co_type1: Option<&ColliderType> = colliders.get(pair.collider1.0);
let co_type2: Option<&ColliderType> = colliders.get(pair.collider2.0);
@@ -666,21 +635,14 @@ impl NarrowPhase {
}
}
- pub(crate) fn register_pairs<Bodies, Colliders>(
+ pub(crate) fn register_pairs(
&mut self,
mut islands: Option<&mut IslandManager>,
- colliders: &Colliders,
- bodies: &mut Bodies,
+ colliders: &ColliderSet,
+ bodies: &mut RigidBodySet,
broad_phase_events: &[BroadPhasePairEvent],
events: &dyn EventHandler,
- ) where
- Bodies: ComponentSetMut<RigidBodyActivation>
- + ComponentSetMut<RigidBodyIds>
- + ComponentSet<RigidBodyType>,
- Colliders: ComponentSet<ColliderType>
- + ComponentSet<ColliderFlags>
- + ComponentSetOption<ColliderParent>,
- {
+ ) {
for event in broad_phase_events {
match event {
BroadPhasePairEvent::AddPair(pair) => {
@@ -700,24 +662,14 @@ impl NarrowPhase {
}
}
- pub(crate) fn compute_intersections<Bodies, Colliders>(
+ pub(crate) fn compute_intersections(
&mut self,
- bodies: &Bodies,
- colliders: &Colliders,
+ bodies: &RigidBodySet,
+ colliders: &ColliderSet,
modified_colliders: &[ColliderHandle],
- hooks: &dyn PhysicsHooks<Bodies, Colliders>,
+ hooks: &dyn PhysicsHooks,
events: &dyn EventHandler,
- ) where
- Bodies: ComponentSet<RigidBodyActivation>
- + ComponentSet<RigidBodyType>
- + ComponentSet<RigidBodyDominance>,
- Colliders: ComponentSet<ColliderChanges>
- + ComponentSetOption<ColliderParent>
- + ComponentSet<ColliderShape>
- + ComponentSet<ColliderPosition>
- + ComponentSet<ColliderMaterial>
- + ComponentSet<ColliderFlags>,
- {
+ ) {
if modified_colliders.is_empty() {
return;
}
@@ -824,25 +776,15 @@ impl NarrowPhase {
});
}
- pub(crate) fn compute_contacts<Bodies, Colliders>(
+ pub(crate) fn compute_contacts(
&mut self,
prediction_distance: Real,
- bodies: &Bodies,
- colliders: &Colliders,
+ bodies: &RigidBodySet,
+ colliders: &ColliderSet,
modified_colliders: &[ColliderHandle],
- hooks: &dyn PhysicsHooks<Bodies, Colliders>,
+ hooks: &dyn PhysicsHooks,
events: &dyn EventHandler,
- ) where
- Bodies: ComponentSet<RigidBodyActivation>
- + ComponentSet<RigidBodyType>
- + ComponentSet<RigidBodyDominance>,
- Colliders: ComponentSet<ColliderChanges>
- + ComponentSetOption<ColliderParent>
- + ComponentSet<ColliderShape>
- + ComponentSet<ColliderPosition>
- + ComponentSet<ColliderMaterial>
- + ComponentSet<ColliderFlags>,
- {
+ ) {
if modified_colliders.is_empty() {
return;
}
@@ -1057,17 +999,13 @@ impl NarrowPhase {
/// Retrieve all the interactions with at least one contact point, happening between two active bodies.
// NOTE: this is very similar to the code from ImpulseJointSet::select_active_interactions.
- pub(crate) fn select_active_contacts<'a, Bodies>(
+ pub(crate) fn select_active_contacts<'a>(
&'a mut self,
islands: &IslandManager,
- bodies: &Bodies,
+ bodies: &RigidBodySet,
out_manifolds: &mut Vec<&'a mut ContactManifold>,
out: &mut Vec<Vec<ContactManifoldIndex>>,
- ) where
- Bodies: ComponentSet<RigidBodyIds>
- + ComponentSet<RigidBodyType>
- + ComponentSet<RigidBodyActivation>,
- {
+ ) {
for out_island in &mut out[..islands.num_islands()] {
out_island.clear();
}