aboutsummaryrefslogtreecommitdiff
path: root/src_testbed/testbed.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src_testbed/testbed.rs')
-rw-r--r--src_testbed/testbed.rs84
1 files changed, 52 insertions, 32 deletions
diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs
index bc5cd6c..a2d20d0 100644
--- a/src_testbed/testbed.rs
+++ b/src_testbed/testbed.rs
@@ -24,7 +24,7 @@ use rapier::dynamics::{
use rapier::geometry::{ColliderHandle, ColliderSet, NarrowPhase};
#[cfg(feature = "dim3")]
use rapier::geometry::{InteractionGroups, Ray};
-use rapier::math::{Isometry, Vector};
+use rapier::math::Vector;
use rapier::pipeline::PhysicsHooks;
#[cfg(all(feature = "dim2", feature = "other-backends"))]
@@ -125,7 +125,6 @@ pub struct Testbed {
nsteps: usize,
camera_locked: bool, // Used so that the camera can remain the same before and after we change backend or press the restart button.
plugins: Vec<Box<dyn TestbedPlugin>>,
- hide_counters: bool,
// persistant_contacts: HashMap<ContactId, bool>,
font: Rc<Font>,
cursor_pos: Point2<f32>,
@@ -185,7 +184,6 @@ impl Testbed {
graphics,
nsteps: 1,
camera_locked: false,
- hide_counters: true,
// persistant_contacts: HashMap::new(),
font: Font::default(),
cursor_pos: Point2::new(0.0f32, 0.0),
@@ -225,14 +223,6 @@ impl Testbed {
self.state.can_grab_behind_ground = allow;
}
- pub fn hide_performance_counters(&mut self) {
- self.hide_counters = true;
- }
-
- pub fn show_performance_counters(&mut self) {
- self.hide_counters = false;
- }
-
pub fn integration_parameters_mut(&mut self) -> &mut IntegrationParameters {
&mut self.harness.physics.integration_parameters
}
@@ -769,11 +759,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) => {
@@ -1198,18 +1215,18 @@ impl State for Testbed {
}
}
- if self
- .state
- .prev_flags
- .contains(TestbedStateFlags::SUB_STEPPING)
- != self.state.flags.contains(TestbedStateFlags::SUB_STEPPING)
- {
- self.harness
- .physics
- .integration_parameters
- .return_after_ccd_substep =
- self.state.flags.contains(TestbedStateFlags::SUB_STEPPING);
- }
+ // if self
+ // .state
+ // .prev_flags
+ // .contains(TestbedStateFlags::SUB_STEPPING)
+ // != self.state.flags.contains(TestbedStateFlags::SUB_STEPPING)
+ // {
+ // self.harness
+ // .physics
+ // .integration_parameters
+ // .return_after_ccd_substep =
+ // self.state.flags.contains(TestbedStateFlags::SUB_STEPPING);
+ // }
if self.state.prev_flags.contains(TestbedStateFlags::SHAPES)
!= self.state.flags.contains(TestbedStateFlags::SHAPES)
@@ -1315,14 +1332,6 @@ impl State for Testbed {
for plugin in &mut self.plugins {
plugin.run_callbacks(window, &mut self.harness.physics, &self.harness.state);
}
-
- // if true {
- // // !self.hide_counters {
- // #[cfg(not(feature = "log"))]
- // println!("{}", self.world.counters);
- // #[cfg(feature = "log")]
- // debug!("{}", self.world.counters);
- // }
}
}
@@ -1452,8 +1461,19 @@ Hashes at frame: {}
}
fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet) {
+ use rapier::math::Isometry;
+
for pair in nf.contact_pairs() {
for manifold in &pair.manifolds {
+ /*
+ for contact in &manifold.data.solver_contacts {
+ 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)