diff options
| author | Sébastien Crozet <developer@crozet.re> | 2020-08-25 22:10:25 +0200 |
|---|---|---|
| committer | Sébastien Crozet <developer@crozet.re> | 2020-08-25 22:10:25 +0200 |
| commit | 754a48b7ff6d8c58b1ee08651e60112900b60455 (patch) | |
| tree | 7d777a6c003f1f5d8f8d24f533f35a95a88957fe /src/pipeline/event_handler.rs | |
| download | rapier-754a48b7ff6d8c58b1ee08651e60112900b60455.tar.gz rapier-754a48b7ff6d8c58b1ee08651e60112900b60455.tar.bz2 rapier-754a48b7ff6d8c58b1ee08651e60112900b60455.zip | |
First public release of Rapier.v0.1.0
Diffstat (limited to 'src/pipeline/event_handler.rs')
| -rw-r--r-- | src/pipeline/event_handler.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/pipeline/event_handler.rs b/src/pipeline/event_handler.rs new file mode 100644 index 0000000..67e4a78 --- /dev/null +++ b/src/pipeline/event_handler.rs @@ -0,0 +1,51 @@ +use crate::geometry::{ContactEvent, ProximityEvent}; +use crossbeam::channel::Sender; + +/// Trait implemented by structures responsible for handling events generated by the physics engine. +/// +/// Implementors of this trait will typically collect these events for future processing. +pub trait EventHandler: Send + Sync { + /// Handle a proximity event. + /// + /// A proximity event is emitted when the state of proximity between two colliders changes. + fn handle_proximity_event(&self, event: ProximityEvent); + /// Handle a contact event. + /// + /// A contact event is emitted when two collider start or stop touching, independently from the + /// number of contact points involved. + fn handle_contact_event(&self, event: ContactEvent); +} + +impl EventHandler for () { + fn handle_proximity_event(&self, _event: ProximityEvent) {} + fn handle_contact_event(&self, _event: ContactEvent) {} +} + +/// A physics event handler that collects events into a crossbeam channel. +pub struct ChannelEventCollector { + proximity_event_sender: Sender<ProximityEvent>, + contact_event_sender: Sender<ContactEvent>, +} + +impl ChannelEventCollector { + /// Initialize a new physics event handler from crossbeam channel senders. + pub fn new( + proximity_event_sender: Sender<ProximityEvent>, + contact_event_sender: Sender<ContactEvent>, + ) -> Self { + Self { + proximity_event_sender, + contact_event_sender, + } + } +} + +impl EventHandler for ChannelEventCollector { + fn handle_proximity_event(&self, event: ProximityEvent) { + let _ = self.proximity_event_sender.send(event); + } + + fn handle_contact_event(&self, event: ContactEvent) { + let _ = self.contact_event_sender.send(event); + } +} |
