diff options
| author | Thierry Berger <contact@thierryberger.com> | 2024-06-03 15:20:24 +0200 |
|---|---|---|
| committer | Thierry Berger <contact@thierryberger.com> | 2024-06-03 15:20:24 +0200 |
| commit | e1ed90603e618e28f48916690d761e0d8213e2ad (patch) | |
| tree | 8399da9825ca9ee8edd601b1265e818fa303b541 /src/geometry/broad_phase.rs | |
| parent | fe336b9b98d5825544ad3a153a84cb59dc9171c6 (diff) | |
| parent | 856675032e76b6eb4bc9e0be4dc87abdbcfe0421 (diff) | |
| download | rapier-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.rs | 50 |
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>, + ); +} |
