diff options
| author | Crozet Sébastien <developer@crozet.re> | 2020-12-17 18:37:16 +0100 |
|---|---|---|
| committer | Crozet Sébastien <developer@crozet.re> | 2020-12-29 11:31:59 +0100 |
| commit | 8fe2df126a279a435cc544b150aadf8f7b757868 (patch) | |
| tree | 5e574a98190b393d3d54af8922146d5078058824 /src/geometry/narrow_phase.rs | |
| parent | 29717c2887b2db39faf9c25053730b661dc5da2b (diff) | |
| download | rapier-8fe2df126a279a435cc544b150aadf8f7b757868.tar.gz rapier-8fe2df126a279a435cc544b150aadf8f7b757868.tar.bz2 rapier-8fe2df126a279a435cc544b150aadf8f7b757868.zip | |
Remove some irrelevant code.
Diffstat (limited to 'src/geometry/narrow_phase.rs')
| -rw-r--r-- | src/geometry/narrow_phase.rs | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/src/geometry/narrow_phase.rs b/src/geometry/narrow_phase.rs index d9a4f31..ba60ef4 100644 --- a/src/geometry/narrow_phase.rs +++ b/src/geometry/narrow_phase.rs @@ -1,26 +1,19 @@ #[cfg(feature = "parallel")] use rayon::prelude::*; +use crate::data::pubsub::Subscription; +use crate::data::Coarena; use crate::dynamics::RigidBodySet; -use eagl::query::{DefaultQueryDispatcher, PersistentQueryDispatcher, QueryDispatcher}; -//#[cfg(feature = "simd-is-enabled")] -//use crate::geometry::{ -// contact_generator::ContactGenerationContextSimd, -// intersection_detector::ProximityDetectionContextSimd, WBall, -//}; use crate::geometry::{ - BroadPhasePairEvent, ColliderGraphIndex, ColliderHandle, ContactEvent, ContactManifoldData, - ContactPairFilter, IntersectionEvent, PairFilterContext, ProximityPairFilter, RemovedCollider, - SolverFlags, + BroadPhasePairEvent, ColliderGraphIndex, ColliderHandle, ContactData, ContactEvent, + ContactManifoldData, ContactPairFilter, IntersectionEvent, PairFilterContext, + ProximityPairFilter, RemovedCollider, SolverFlags, }; use crate::geometry::{ColliderSet, ContactManifold, ContactPair, InteractionGraph}; -//#[cfg(feature = "simd-is-enabled")] -//use crate::math::{SimdReal, SIMD_WIDTH}; -use crate::data::pubsub::Subscription; -use crate::data::Coarena; use crate::pipeline::EventHandler; +use cdl::query::{DefaultQueryDispatcher, PersistentQueryDispatcher, QueryDispatcher}; use std::collections::HashMap; -//use simba::simd::SimdValue; +use std::sync::Arc; #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] #[derive(Copy, Clone, Debug, PartialEq, Eq)] @@ -42,14 +35,17 @@ impl ColliderGraphIndices { #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] #[derive(Clone)] pub struct NarrowPhase { + #[serde(skip, default = "default_query_dispatcher")] + query_dispatcher: Arc<dyn PersistentQueryDispatcher<ContactManifoldData, ContactData>>, contact_graph: InteractionGraph<ContactPair>, intersection_graph: InteractionGraph<bool>, graph_indices: Coarena<ColliderGraphIndices>, removed_colliders: Option<Subscription<RemovedCollider>>, - // ball_ball: Vec<usize>, // Workspace: Vec<*mut ContactPair>, - // shape_shape: Vec<usize>, // Workspace: Vec<*mut ContactPair>, - // ball_ball_prox: Vec<usize>, // Workspace: Vec<*mut bool>, - // shape_shape_prox: Vec<usize>, // Workspace: Vec<*mut bool>, +} + +fn default_query_dispatcher() -> Arc<dyn PersistentQueryDispatcher<ContactManifoldData, ContactData>> +{ + Arc::new(DefaultQueryDispatcher) } pub(crate) type ContactManifoldIndex = usize; @@ -57,15 +53,20 @@ pub(crate) type ContactManifoldIndex = usize; impl NarrowPhase { /// Creates a new empty narrow-phase. pub fn new() -> Self { + Self::with_query_dispatcher(DefaultQueryDispatcher) + } + + /// Creates a new empty narrow-phase with a custom query dispatcher. + pub fn with_query_dispatcher<D>(d: D) -> Self + where + D: 'static + PersistentQueryDispatcher<ContactManifoldData, ContactData>, + { Self { + query_dispatcher: Arc::new(d), contact_graph: InteractionGraph::new(), intersection_graph: InteractionGraph::new(), graph_indices: Coarena::new(), removed_colliders: None, - // ball_ball: Vec::new(), - // shape_shape: Vec::new(), - // ball_ball_prox: Vec::new(), - // shape_shape_prox: Vec::new(), } } @@ -391,6 +392,7 @@ impl NarrowPhase { events: &dyn EventHandler, ) { let nodes = &self.intersection_graph.graph.nodes; + let query_dispatcher = &*self.query_dispatcher; par_iter_mut!(&mut self.intersection_graph.graph.edges).for_each(|edge| { let handle1 = nodes[edge.source().index()].weight; let handle2 = nodes[edge.target().index()].weight; @@ -434,9 +436,9 @@ impl NarrowPhase { } let pos12 = co1.position().inverse() * co2.position(); - let dispatcher = DefaultQueryDispatcher; - if let Ok(intersection) = dispatcher.intersection_test(&pos12, co1.shape(), co2.shape()) + if let Ok(intersection) = + query_dispatcher.intersection_test(&pos12, co1.shape(), co2.shape()) { if intersection != edge.weight { edge.weight = intersection; @@ -458,6 +460,8 @@ impl NarrowPhase { pair_filter: Option<&dyn ContactPairFilter>, events: &dyn EventHandler, ) { + let query_dispatcher = &*self.query_dispatcher; + par_iter_mut!(&mut self.contact_graph.graph.edges).for_each(|edge| { let pair = &mut edge.weight; let co1 = &colliders[pair.pair.collider1]; @@ -507,9 +511,8 @@ impl NarrowPhase { solver_flags.remove(SolverFlags::COMPUTE_IMPULSES); } - let dispatcher = DefaultQueryDispatcher; let pos12 = co1.position().inverse() * co2.position(); - dispatcher.contact_manifolds( + query_dispatcher.contact_manifolds( &pos12, co1.shape(), co2.shape(), |
