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, contact_event_sender: Sender, } impl ChannelEventCollector { /// Initialize a new physics event handler from crossbeam channel senders. pub fn new( proximity_event_sender: Sender, contact_event_sender: Sender, ) -> 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); } }