aboutsummaryrefslogtreecommitdiff
path: root/src/pipeline
diff options
context:
space:
mode:
Diffstat (limited to 'src/pipeline')
-rw-r--r--src/pipeline/collision_pipeline.rs23
-rw-r--r--src/pipeline/physics_pipeline.rs11
-rw-r--r--src/pipeline/query_pipeline.rs35
3 files changed, 57 insertions, 12 deletions
diff --git a/src/pipeline/collision_pipeline.rs b/src/pipeline/collision_pipeline.rs
index 5a19e52..b8896e8 100644
--- a/src/pipeline/collision_pipeline.rs
+++ b/src/pipeline/collision_pipeline.rs
@@ -1,7 +1,10 @@
//! Physics pipeline structures.
use crate::dynamics::{JointSet, RigidBodySet};
-use crate::geometry::{BroadPhase, BroadPhasePairEvent, ColliderPair, ColliderSet, NarrowPhase};
+use crate::geometry::{
+ BroadPhase, BroadPhasePairEvent, ColliderPair, ColliderSet, ContactPairFilter, NarrowPhase,
+ ProximityPairFilter,
+};
use crate::pipeline::EventHandler;
/// The collision pipeline, responsible for performing collision detection between colliders.
@@ -40,6 +43,8 @@ impl CollisionPipeline {
narrow_phase: &mut NarrowPhase,
bodies: &mut RigidBodySet,
colliders: &mut ColliderSet,
+ contact_pair_filter: Option<&dyn ContactPairFilter>,
+ proximity_pair_filter: Option<&dyn ProximityPairFilter>,
events: &dyn EventHandler,
) {
bodies.maintain_active_set();
@@ -52,8 +57,20 @@ impl CollisionPipeline {
narrow_phase.register_pairs(colliders, bodies, &self.broad_phase_events, events);
- narrow_phase.compute_contacts(prediction_distance, bodies, colliders, events);
- narrow_phase.compute_proximities(prediction_distance, bodies, colliders, events);
+ narrow_phase.compute_contacts(
+ prediction_distance,
+ bodies,
+ colliders,
+ contact_pair_filter,
+ events,
+ );
+ narrow_phase.compute_proximities(
+ prediction_distance,
+ bodies,
+ colliders,
+ proximity_pair_filter,
+ events,
+ );
bodies.update_active_set_with_contacts(
colliders,
diff --git a/src/pipeline/physics_pipeline.rs b/src/pipeline/physics_pipeline.rs
index 47fd260..0720ff1 100644
--- a/src/pipeline/physics_pipeline.rs
+++ b/src/pipeline/physics_pipeline.rs
@@ -7,7 +7,8 @@ use crate::dynamics::{IntegrationParameters, JointSet, RigidBodySet};
#[cfg(feature = "parallel")]
use crate::dynamics::{JointGraphEdge, ParallelIslandSolver as IslandSolver};
use crate::geometry::{
- BroadPhase, BroadPhasePairEvent, ColliderPair, ColliderSet, ContactManifoldIndex, NarrowPhase,
+ BroadPhase, BroadPhasePairEvent, ColliderPair, ColliderSet, ContactManifoldIndex,
+ ContactPairFilter, NarrowPhase, ProximityPairFilter,
};
use crate::math::Vector;
use crate::pipeline::EventHandler;
@@ -68,6 +69,8 @@ impl PhysicsPipeline {
bodies: &mut RigidBodySet,
colliders: &mut ColliderSet,
joints: &mut JointSet,
+ contact_pair_filter: Option<&dyn ContactPairFilter>,
+ proximity_pair_filter: Option<&dyn ProximityPairFilter>,
events: &dyn EventHandler,
) {
self.counters.step_started();
@@ -112,12 +115,14 @@ impl PhysicsPipeline {
integration_parameters.prediction_distance,
bodies,
colliders,
+ contact_pair_filter,
events,
);
narrow_phase.compute_proximities(
integration_parameters.prediction_distance,
bodies,
colliders,
+ proximity_pair_filter,
events,
);
// println!("Compute contact time: {}", instant::now() - t);
@@ -285,6 +290,8 @@ mod test {
&mut bodies,
&mut colliders,
&mut joints,
+ None,
+ None,
&(),
);
}
@@ -327,6 +334,8 @@ mod test {
&mut bodies,
&mut colliders,
&mut joints,
+ None,
+ None,
&(),
);
}
diff --git a/src/pipeline/query_pipeline.rs b/src/pipeline/query_pipeline.rs
index 32f59fc..00d4396 100644
--- a/src/pipeline/query_pipeline.rs
+++ b/src/pipeline/query_pipeline.rs
@@ -1,5 +1,7 @@
use crate::dynamics::RigidBodySet;
-use crate::geometry::{Collider, ColliderHandle, ColliderSet, Ray, RayIntersection, WQuadtree};
+use crate::geometry::{
+ Collider, ColliderHandle, ColliderSet, InteractionGroups, Ray, RayIntersection, WQuadtree,
+};
/// A pipeline for performing queries on all the colliders of a scene.
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
@@ -59,6 +61,7 @@ impl QueryPipeline {
colliders: &'a ColliderSet,
ray: &Ray,
max_toi: f32,
+ groups: InteractionGroups,
) -> Option<(ColliderHandle, &'a Collider, RayIntersection)> {
// TODO: avoid allocation?
let mut inter = Vec::new();
@@ -69,10 +72,17 @@ impl QueryPipeline {
for handle in inter {
let collider = &colliders[handle];
- if let Some(inter) = collider.shape().cast_ray(collider.position(), ray, max_toi) {
- if inter.toi < best {
- best = inter.toi;
- result = Some((handle, collider, inter));
+ if collider.collision_groups.test(groups) {
+ if let Some(inter) = collider.shape().toi_and_normal_with_ray(
+ collider.position(),
+ ray,
+ max_toi,
+ true,
+ ) {
+ if inter.toi < best {
+ best = inter.toi;
+ result = Some((handle, collider, inter));
+ }
}
}
}
@@ -95,6 +105,7 @@ impl QueryPipeline {
colliders: &'a ColliderSet,
ray: &Ray,
max_toi: f32,
+ groups: InteractionGroups,
mut callback: impl FnMut(ColliderHandle, &'a Collider, RayIntersection) -> bool,
) {
// TODO: avoid allocation?
@@ -103,9 +114,17 @@ impl QueryPipeline {
for handle in inter {
let collider = &colliders[handle];
- if let Some(inter) = collider.shape().cast_ray(collider.position(), ray, max_toi) {
- if !callback(handle, collider, inter) {
- return;
+
+ if collider.collision_groups.test(groups) {
+ if let Some(inter) = collider.shape().toi_and_normal_with_ray(
+ collider.position(),
+ ray,
+ max_toi,
+ true,
+ ) {
+ if !callback(handle, collider, inter) {
+ return;
+ }
}
}
}