diff options
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); + } +} |
