aboutsummaryrefslogtreecommitdiff
path: root/src/pipeline/event_handler.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2020-08-25 22:10:25 +0200
committerSébastien Crozet <developer@crozet.re>2020-08-25 22:10:25 +0200
commit754a48b7ff6d8c58b1ee08651e60112900b60455 (patch)
tree7d777a6c003f1f5d8f8d24f533f35a95a88957fe /src/pipeline/event_handler.rs
downloadrapier-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.rs51
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);
+ }
+}