aboutsummaryrefslogtreecommitdiff
path: root/src/pipeline/event_handler.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2023-01-22 19:01:09 +0100
committerSébastien Crozet <developer@crozet.re>2023-01-22 19:01:09 +0100
commit26596bdc2ef7537619ab763668381f8b5496b726 (patch)
tree1ddab05177fba9f61ad68c779c1f9bb09fd35a64 /src/pipeline/event_handler.rs
parent1a4183cc94acc3210e4ae467abbea7d68e51c5ff (diff)
downloadrapier-voxels.tar.gz
rapier-voxels.tar.bz2
rapier-voxels.zip
Voxel fracture experimentsvoxels
Diffstat (limited to 'src/pipeline/event_handler.rs')
-rw-r--r--src/pipeline/event_handler.rs39
1 files changed, 38 insertions, 1 deletions
diff --git a/src/pipeline/event_handler.rs b/src/pipeline/event_handler.rs
index e5270ad..6e3667d 100644
--- a/src/pipeline/event_handler.rs
+++ b/src/pipeline/event_handler.rs
@@ -1,8 +1,15 @@
use crate::dynamics::RigidBodySet;
-use crate::geometry::{ColliderSet, CollisionEvent, ContactForceEvent, ContactPair};
+use crate::geometry::{
+ ColliderHandle, ColliderSet, CollisionEvent, ContactForceEvent, ContactPair,
+};
use crate::math::Real;
use crossbeam::channel::Sender;
+pub struct FractureEvent {
+ pub fractured_collider: ColliderHandle,
+ pub fragments: Vec<ColliderHandle>,
+}
+
bitflags::bitflags! {
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
/// Flags affecting the events generated for this collider.
@@ -13,6 +20,9 @@ bitflags::bitflags! {
/// If set, Rapier will call `EventHandler::handle_contact_force_event`
/// whenever relevant for this collider.
const CONTACT_FORCE_EVENTS = 0b0010;
+ /// If set, Rapier will call `EventHandler::handle_fracture_event` whenever this colliders
+ /// is fractured.
+ const FRACTURE_EVENTS = 0b0010;
}
}
@@ -66,6 +76,13 @@ pub trait EventHandler: Send + Sync {
contact_pair: &ContactPair,
total_force_magnitude: Real,
);
+
+ fn handle_fracture_event(
+ &self,
+ bodies: &RigidBodySet,
+ colliders: &ColliderSet,
+ event: FractureEvent,
+ );
}
impl EventHandler for () {
@@ -87,12 +104,21 @@ impl EventHandler for () {
_total_force_magnitude: Real,
) {
}
+
+ fn handle_fracture_event(
+ &self,
+ _bodies: &RigidBodySet,
+ _colliders: &ColliderSet,
+ _event: FractureEvent,
+ ) {
+ }
}
/// A collision event handler that collects events into a crossbeam channel.
pub struct ChannelEventCollector {
collision_event_sender: Sender<CollisionEvent>,
contact_force_event_sender: Sender<ContactForceEvent>,
+ fracture_event_sender: Sender<FractureEvent>,
}
impl ChannelEventCollector {
@@ -100,10 +126,12 @@ impl ChannelEventCollector {
pub fn new(
collision_event_sender: Sender<CollisionEvent>,
contact_force_event_sender: Sender<ContactForceEvent>,
+ fracture_event_sender: Sender<FractureEvent>,
) -> Self {
Self {
collision_event_sender,
contact_force_event_sender,
+ fracture_event_sender,
}
}
}
@@ -130,4 +158,13 @@ impl EventHandler for ChannelEventCollector {
let result = ContactForceEvent::from_contact_pair(dt, contact_pair, total_force_magnitude);
let _ = self.contact_force_event_sender.send(result);
}
+
+ fn handle_fracture_event(
+ &self,
+ _bodies: &RigidBodySet,
+ _colliders: &ColliderSet,
+ event: FractureEvent,
+ ) {
+ let _ = self.fracture_event_sender.send(event);
+ }
}