diff options
| author | Crozet Sébastien <developer@crozet.re> | 2020-12-17 10:24:36 +0100 |
|---|---|---|
| committer | Crozet Sébastien <developer@crozet.re> | 2020-12-29 11:31:00 +0100 |
| commit | e231bacec608fa5efd24f7a876572927dbd6c9c4 (patch) | |
| tree | 596f0b6a1fc666586ffcd71d07a39a7c182c6ef8 /src/geometry/narrow_phase.rs | |
| parent | cc6d1b973002b4d366bc81ec6bf9e8240ad7b404 (diff) | |
| download | rapier-e231bacec608fa5efd24f7a876572927dbd6c9c4.tar.gz rapier-e231bacec608fa5efd24f7a876572927dbd6c9c4.tar.bz2 rapier-e231bacec608fa5efd24f7a876572927dbd6c9c4.zip | |
Move all the contact manifold computations out of Rapier.
Diffstat (limited to 'src/geometry/narrow_phase.rs')
| -rw-r--r-- | src/geometry/narrow_phase.rs | 58 |
1 files changed, 21 insertions, 37 deletions
diff --git a/src/geometry/narrow_phase.rs b/src/geometry/narrow_phase.rs index ad2d514..240ed31 100644 --- a/src/geometry/narrow_phase.rs +++ b/src/geometry/narrow_phase.rs @@ -2,28 +2,26 @@ use rayon::prelude::*; use crate::dynamics::RigidBodySet; -use crate::geometry::contact_generator::{ - ContactDispatcher, ContactGenerationContext, DefaultContactDispatcher, -}; use crate::geometry::proximity_detector::{ DefaultProximityDispatcher, ProximityDetectionContext, ProximityDispatcher, }; +use eagl::query::{DefaultQueryDispatcher, PersistentQueryDispatcher}; //#[cfg(feature = "simd-is-enabled")] //use crate::geometry::{ // contact_generator::ContactGenerationContextSimd, // proximity_detector::ProximityDetectionContextSimd, WBall, //}; use crate::geometry::{ - BroadPhasePairEvent, ColliderGraphIndex, ColliderHandle, ContactEvent, ContactPairFilter, - PairFilterContext, ProximityEvent, ProximityPair, ProximityPairFilter, RemovedCollider, - SolverFlags, + BroadPhasePairEvent, ColliderGraphIndex, ColliderHandle, ContactEvent, ContactManifoldData, + ContactPairFilter, PairFilterContext, ProximityEvent, ProximityPair, ProximityPairFilter, + RemovedCollider, SolverFlags, }; use crate::geometry::{ColliderSet, ContactManifold, ContactPair, InteractionGraph}; //#[cfg(feature = "simd-is-enabled")] //use crate::math::{SimdReal, SIMD_WIDTH}; -use crate::buckler::query::Proximity; use crate::data::pubsub::Subscription; use crate::data::Coarena; +use crate::eagl::query::Proximity; use crate::pipeline::EventHandler; use std::collections::HashMap; //use simba::simd::SimdValue; @@ -324,10 +322,7 @@ impl NarrowPhase { .find_edge(gid1.contact_graph_index, gid2.contact_graph_index) .is_none() { - let dispatcher = DefaultContactDispatcher; - let generator = dispatcher - .dispatch(co1.shape().shape_type(), co2.shape().shape_type()); - let interaction = ContactPair::new(*pair, generator.0, generator.1); + let interaction = ContactPair::new(*pair); let _ = self.contact_graph.add_edge( gid1.contact_graph_index, gid2.contact_graph_index, @@ -523,33 +518,22 @@ impl NarrowPhase { solver_flags.remove(SolverFlags::COMPUTE_IMPULSES); } - let dispatcher = DefaultContactDispatcher; - if pair.generator.is_none() { - // We need a redispatch for this generator. - // This can happen, e.g., after restoring a snapshot of the narrow-phase. - let (generator, workspace) = - dispatcher.dispatch(co1.shape().shape_type(), co2.shape().shape_type()); - pair.generator = Some(generator); - - // Keep the workspace if one already exists. - if pair.generator_workspace.is_none() { - pair.generator_workspace = workspace; - } - } - - let context = ContactGenerationContext { - dispatcher: &dispatcher, + let dispatcher = DefaultQueryDispatcher; + let pos12 = co1.position().inverse() * co2.position(); + dispatcher.contact_manifolds( + &pos12, + co1.shape(), + co2.shape(), prediction_distance, - colliders, - pair, - solver_flags, - }; - - context - .pair - .generator - .unwrap() - .generate_contacts(context, events); + &mut pair.manifolds, + &mut pair.workspace, + ); + + // TODO: don't write this everytime? + for manifold in &mut pair.manifolds { + manifold.data = + ContactManifoldData::from_colliders(pair.pair, co1, co2, solver_flags); + } }); } |
