aboutsummaryrefslogtreecommitdiff
path: root/src_testbed/testbed.rs
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2021-03-26 18:16:27 +0100
committerCrozet Sébastien <developer@crozet.re>2021-03-26 18:16:27 +0100
commit97157c9423f3360c5e941b4065377689221014ae (patch)
tree707adf6e1feab0a9b7752d292baa161de790a8a1 /src_testbed/testbed.rs
parent326469a1df9d8502903d88fe8e47a67e9e7c9edd (diff)
downloadrapier-97157c9423f3360c5e941b4065377689221014ae.tar.gz
rapier-97157c9423f3360c5e941b4065377689221014ae.tar.bz2
rapier-97157c9423f3360c5e941b4065377689221014ae.zip
First working version of non-linear CCD based on single-substep motion-clamping.
Diffstat (limited to 'src_testbed/testbed.rs')
-rw-r--r--src_testbed/testbed.rs44
1 files changed, 43 insertions, 1 deletions
diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs
index bc5cd6c..0463da8 100644
--- a/src_testbed/testbed.rs
+++ b/src_testbed/testbed.rs
@@ -769,11 +769,38 @@ impl Testbed {
}
#[cfg(feature = "dim3")]
- fn handle_special_event(&mut self, window: &mut Window, _event: Event) {
+ fn handle_special_event(&mut self, window: &mut Window, event: Event) {
+ use rapier::dynamics::RigidBodyBuilder;
+ use rapier::geometry::ColliderBuilder;
+
if window.is_conrod_ui_capturing_mouse() {
return;
}
+ match event.value {
+ WindowEvent::Key(Key::Space, Action::Release, _) => {
+ let cam_pos = self.graphics.camera().view_transform().inverse();
+ let forward = cam_pos * -Vector::z();
+ let vel = forward * 1000.0;
+
+ let bodies = &mut self.harness.physics.bodies;
+ let colliders = &mut self.harness.physics.colliders;
+
+ let collider = ColliderBuilder::cuboid(4.0, 2.0, 0.4).density(20.0).build();
+ // let collider = ColliderBuilder::ball(2.0).density(1.0).build();
+ let body = RigidBodyBuilder::new_dynamic()
+ .position(cam_pos)
+ .linvel(vel.x, vel.y, vel.z)
+ .ccd_enabled(true)
+ .build();
+
+ let body_handle = bodies.insert(body);
+ colliders.insert(collider, body_handle, bodies);
+ self.graphics.add(window, body_handle, bodies, colliders);
+ }
+ _ => {}
+ }
+
/*
match event.value {
WindowEvent::MouseButton(MouseButton::Button1, Action::Press, modifier) => {
@@ -1454,6 +1481,20 @@ Hashes at frame: {}
fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet) {
for pair in nf.contact_pairs() {
for manifold in &pair.manifolds {
+ for contact in &manifold.data.solver_contacts {
+ let color = if contact.dist > 0.0 {
+ Point3::new(0.0, 0.0, 1.0)
+ } else {
+ Point3::new(1.0, 0.0, 0.0)
+ };
+
+ let p = contact.point;
+ let n = manifold.data.normal;
+
+ use crate::engine::GraphicsWindow;
+ window.draw_graphics_line(&p, &(p + n * 0.4), &Point3::new(0.5, 1.0, 0.5));
+ }
+ /*
for pt in manifold.contacts() {
let color = if pt.dist > 0.0 {
Point3::new(0.0, 0.0, 1.0)
@@ -1474,6 +1515,7 @@ fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet)
window.draw_graphics_line(&start, &(start + n * 0.4), &Point3::new(0.5, 1.0, 0.5));
window.draw_graphics_line(&start, &end, &color);
}
+ */
}
}
}