perigee/physics/
collider_event_listener.rs

1use crate::event_channel::EventChannel;
2use crate::traits::physics::ColliderEventListener;
3use crossbeam::channel::Sender;
4use rapier3d::prelude::*;
5use std::ops::Deref;
6
7#[derive(Debug, Clone)]
8pub enum ColliderEvent {
9    CollisionStart(ColliderHandle),
10    CollisionEnd(ColliderHandle),
11    IntersectionStart(ColliderHandle),
12    IntersectionEnd(ColliderHandle),
13    ContactForceEvent(ColliderHandle, ContactForceEvent),
14}
15
16#[derive(Default)]
17pub struct ColliderEventChannel {
18    inner: EventChannel<ColliderEvent>,
19}
20
21impl ColliderEventChannel {
22    pub fn with_capacity(cap: usize) -> Self {
23        Self {
24            inner: EventChannel::with_capacity(cap),
25        }
26    }
27}
28
29impl Deref for ColliderEventChannel {
30    type Target = EventChannel<ColliderEvent>;
31
32    fn deref(&self) -> &Self::Target {
33        &self.inner
34    }
35}
36
37pub struct ColliderEventRelayer {
38    inner: Sender<ColliderEvent>,
39}
40
41impl From<Sender<ColliderEvent>> for ColliderEventRelayer {
42    fn from(sender: Sender<ColliderEvent>) -> Self {
43        Self { inner: sender }
44    }
45}
46
47impl ColliderEventListener for ColliderEventRelayer {
48    fn on_collision_start(&mut self, other: &ColliderHandle) {
49        let _send_result = self.inner.send(ColliderEvent::CollisionStart(*other));
50    }
51
52    fn on_collision_end(&mut self, other: &ColliderHandle) {
53        let _send_result = self.inner.send(ColliderEvent::CollisionEnd(*other));
54    }
55
56    fn on_intersection_start(&mut self, other: &ColliderHandle) {
57        let _send_result = self.inner.send(ColliderEvent::IntersectionStart(*other));
58    }
59
60    fn on_intersection_end(&mut self, other: &ColliderHandle) {
61        let _send_result = self.inner.send(ColliderEvent::IntersectionEnd(*other));
62    }
63
64    fn on_contact_force_event(&mut self, other: &ColliderHandle, details: ContactForceEvent) {
65        let _send_result = self
66            .inner
67            .send(ColliderEvent::ContactForceEvent(*other, details));
68    }
69}