diff options
Diffstat (limited to 'src_testbed/testbed.rs')
| -rw-r--r-- | src_testbed/testbed.rs | 84 |
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) |
