perigee/physics/
collider_event_listener.rs1use 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}