aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/broad_phase.rs
diff options
context:
space:
mode:
authorThierry Berger <contact@thierryberger.com>2024-06-03 15:20:24 +0200
committerThierry Berger <contact@thierryberger.com>2024-06-03 15:20:24 +0200
commite1ed90603e618e28f48916690d761e0d8213e2ad (patch)
tree8399da9825ca9ee8edd601b1265e818fa303b541 /src/geometry/broad_phase.rs
parentfe336b9b98d5825544ad3a153a84cb59dc9171c6 (diff)
parent856675032e76b6eb4bc9e0be4dc87abdbcfe0421 (diff)
downloadrapier-e1ed90603e618e28f48916690d761e0d8213e2ad.tar.gz
rapier-e1ed90603e618e28f48916690d761e0d8213e2ad.tar.bz2
rapier-e1ed90603e618e28f48916690d761e0d8213e2ad.zip
Merge branch 'master' into collider-builder-debug
Diffstat (limited to 'src/geometry/broad_phase.rs')
-rw-r--r--src/geometry/broad_phase.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/geometry/broad_phase.rs b/src/geometry/broad_phase.rs
new file mode 100644
index 0000000..06164a1
--- /dev/null
+++ b/src/geometry/broad_phase.rs
@@ -0,0 +1,50 @@
+use crate::dynamics::RigidBodySet;
+use crate::geometry::{BroadPhasePairEvent, ColliderHandle, ColliderSet};
+use parry::math::Real;
+
+/// An internal index stored in colliders by some broad-phase algorithms.
+pub type BroadPhaseProxyIndex = u32;
+
+/// Trait implemented by broad-phase algorithms supported by Rapier.
+///
+/// The task of a broad-phase algorithm is to detect potential collision pairs, usually based on
+/// bounding volumes. The pairs must be conservative: it is OK to create a collision pair if
+/// two objects don’t actually touch, but it is incorrect to remove a pair between two objects
+/// that are still touching. In other words, it can have false-positive (though these induce
+/// some computational overhead on the narrow-phase), but cannot have false-negative.
+pub trait BroadPhase: Send + Sync + 'static {
+ /// Updates the broad-phase.
+ ///
+ /// The results must be output through the `events` struct. The broad-phase algorithm is only
+ /// required to generate new events (i.e. no need to re-send an `AddPair` event if it was already
+ /// sent previously and no `RemovePair` happened since then). Sending redundant events is allowed
+ /// but can result in a slight computational overhead.
+ ///
+ /// The `colliders` set is mutable only to provide access to
+ /// [`collider.set_internal_broad_phase_proxy_index`]. Other properties of the collider should
+ /// **not** be modified during the broad-phase update.
+ ///
+ /// # Parameters
+ /// - `prediction_distance`: colliders that are not exactly touching, but closer to this
+ /// distance must form a collision pair.
+ /// - `colliders`: the set of colliders. Change detection with `collider.needs_broad_phase_update()`
+ /// can be relied on at this stage.
+ /// - `modified_colliders`: colliders that are know to be modified since the last update.
+ /// - `removed_colliders`: colliders that got removed since the last update. Any associated data
+ /// in the broad-phase should be removed by this call to `update`.
+ /// - `events`: the broad-phase’s output. They indicate what collision pairs need to be created
+ /// and what pairs need to be removed. It is OK to create pairs for colliders that don’t
+ /// actually collide (though this can increase computational overhead in the narrow-phase)
+ /// but it is important not to indicate removal of a collision pair if the underlying colliders
+ /// are still touching or closer than `prediction_distance`.
+ fn update(
+ &mut self,
+ dt: Real,
+ prediction_distance: Real,
+ colliders: &mut ColliderSet,
+ bodies: &RigidBodySet,
+ modified_colliders: &[ColliderHandle],
+ removed_colliders: &[ColliderHandle],
+ events: &mut Vec<BroadPhasePairEvent>,
+ );
+}