aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/broad_phase.rs
diff options
context:
space:
mode:
authorSébastien Crozet <sebcrozet@dimforge.com>2024-03-23 14:36:27 +0100
committerSébastien Crozet <sebastien@crozet.re>2024-03-23 15:17:47 +0100
commit3d112287b9fd5aa3ddf8c17bc1e6065fa721a9ce (patch)
tree406964421a0823fa4706a621e4ae48597ef74704 /src/geometry/broad_phase.rs
parentcfb2c2c93e39e1f59557c4f32fde4a68dc4cd6fc (diff)
downloadrapier-3d112287b9fd5aa3ddf8c17bc1e6065fa721a9ce.tar.gz
rapier-3d112287b9fd5aa3ddf8c17bc1e6065fa721a9ce.tar.bz2
rapier-3d112287b9fd5aa3ddf8c17bc1e6065fa721a9ce.zip
feat: add a BroadPhaseTrait for allowing custom broad-phases
Diffstat (limited to 'src/geometry/broad_phase.rs')
-rw-r--r--src/geometry/broad_phase.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/geometry/broad_phase.rs b/src/geometry/broad_phase.rs
new file mode 100644
index 0000000..e51c351
--- /dev/null
+++ b/src/geometry/broad_phase.rs
@@ -0,0 +1,47 @@
+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 concervative: 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 {
+ /// 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,
+ prediction_distance: Real,
+ colliders: &mut ColliderSet,
+ modified_colliders: &[ColliderHandle],
+ removed_colliders: &[ColliderHandle],
+ events: &mut Vec<BroadPhasePairEvent>,
+ );
+}