aboutsummaryrefslogtreecommitdiff
path: root/src_testbed
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_testbed
parent1a4183cc94acc3210e4ae467abbea7d68e51c5ff (diff)
downloadrapier-voxels.tar.gz
rapier-voxels.tar.bz2
rapier-voxels.zip
Voxel fracture experimentsvoxels
Diffstat (limited to 'src_testbed')
-rw-r--r--src_testbed/harness/mod.rs4
-rw-r--r--src_testbed/objects/node.rs7
-rw-r--r--src_testbed/physics/mod.rs4
3 files changed, 12 insertions, 3 deletions
diff --git a/src_testbed/harness/mod.rs b/src_testbed/harness/mod.rs
index 9608592..464be42 100644
--- a/src_testbed/harness/mod.rs
+++ b/src_testbed/harness/mod.rs
@@ -88,11 +88,13 @@ impl Harness {
pub fn new_empty() -> Self {
let collision_event_channel = crossbeam::channel::unbounded();
let contact_force_event_channel = crossbeam::channel::unbounded();
+ let fracture_event_channel = crossbeam::channel::unbounded();
let event_handler =
- ChannelEventCollector::new(collision_event_channel.0, contact_force_event_channel.0);
+ ChannelEventCollector::new(collision_event_channel.0, contact_force_event_channel.0, fracture_event_channel.0);
let events = PhysicsEvents {
collision_events: collision_event_channel.1,
contact_force_events: contact_force_event_channel.1,
+ fracture_events: fracture_event_channel.1,
};
let physics = PhysicsState::new();
let state = RunState::new();
diff --git a/src_testbed/objects/node.rs b/src_testbed/objects/node.rs
index f4b9015..fbf49f2 100644
--- a/src_testbed/objects/node.rs
+++ b/src_testbed/objects/node.rs
@@ -10,9 +10,10 @@ use bevy::render::render_resource::PrimitiveTopology;
use rapier::geometry::{ColliderHandle, ColliderSet, Shape, ShapeType};
#[cfg(feature = "dim3")]
use rapier::geometry::{Cone, Cylinder};
-use rapier::math::{Isometry, Real, Vector};
+use rapier::math::{Isometry, Point, Real, Vector};
use crate::graphics::BevyMaterial;
+use rapier::prelude::Aabb;
#[cfg(feature = "dim2")]
use {
bevy::sprite::MaterialMesh2dBundle,
@@ -486,6 +487,10 @@ fn generate_collider_mesh(co_shape: &dyn Shape) -> Option<Mesh> {
let poly = co_shape.as_round_convex_polyhedron().unwrap();
bevy_mesh(poly.inner_shape.to_trimesh())
}
+ ShapeType::Voxels => {
+ let voxels = co_shape.as_voxels().unwrap();
+ bevy_mesh(voxels.to_trimesh())
+ }
_ => return None,
};
diff --git a/src_testbed/physics/mod.rs b/src_testbed/physics/mod.rs
index 60214da..9715424 100644
--- a/src_testbed/physics/mod.rs
+++ b/src_testbed/physics/mod.rs
@@ -5,7 +5,7 @@ use rapier::dynamics::{
};
use rapier::geometry::{BroadPhase, ColliderSet, CollisionEvent, ContactForceEvent, NarrowPhase};
use rapier::math::{Real, Vector};
-use rapier::pipeline::{PhysicsHooks, PhysicsPipeline, QueryPipeline};
+use rapier::pipeline::{FractureEvent, PhysicsHooks, PhysicsPipeline, QueryPipeline};
pub struct PhysicsSnapshot {
timestep_id: usize,
@@ -109,11 +109,13 @@ impl PhysicsState {
pub struct PhysicsEvents {
pub collision_events: Receiver<CollisionEvent>,
pub contact_force_events: Receiver<ContactForceEvent>,
+ pub fracture_events: Receiver<FractureEvent>,
}
impl PhysicsEvents {
pub fn poll_all(&self) {
while let Ok(_) = self.collision_events.try_recv() {}
while let Ok(_) = self.contact_force_events.try_recv() {}
+ while let Ok(_) = self.fracture_events.try_recv() {}
}
}