From 683baf6bf77cfb41227ea6ed4a42499d1e051cdf Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sat, 26 Nov 2022 17:45:14 +0100 Subject: Allow the PhysicsPipeline and CollisionPipeline to update the QueryPipeline incrementally --- src_testbed/harness/mod.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'src_testbed') diff --git a/src_testbed/harness/mod.rs b/src_testbed/harness/mod.rs index 2ed9745..91d4da9 100644 --- a/src_testbed/harness/mod.rs +++ b/src_testbed/harness/mod.rs @@ -215,6 +215,7 @@ impl Harness { &mut physics.impulse_joints, &mut physics.multibody_joints, &mut physics.ccd_solver, + &mut physics.query_pipeline, &*physics.hooks, event_handler, ); @@ -233,16 +234,11 @@ impl Harness { &mut self.physics.impulse_joints, &mut self.physics.multibody_joints, &mut self.physics.ccd_solver, + Some(&mut self.physics.query_pipeline), &*self.physics.hooks, &self.event_handler, ); - self.physics.query_pipeline.update( - &self.physics.islands, - &self.physics.bodies, - &self.physics.colliders, - ); - for plugin in &mut self.plugins { plugin.step(&mut self.physics, &self.state) } -- cgit From 849f398031c61b4894d5b8ca229037c026c9186d Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 4 Dec 2022 18:27:38 +0100 Subject: Add a dynamic ray-cast vehicle controller --- src_testbed/testbed.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) (limited to 'src_testbed') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 180bfd4..50b77c8 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -9,6 +9,8 @@ use crate::{debug_render, ui}; use crate::{graphics::GraphicsManager, harness::RunState}; use na::{self, Point2, Point3, Vector3}; +#[cfg(feature = "dim3")] +use rapier::control::DynamicRayCastVehicleController; use rapier::control::KinematicCharacterController; use rapier::dynamics::{ ImpulseJointSet, IntegrationParameters, MultibodyJointSet, RigidBodyActivation, @@ -100,6 +102,8 @@ pub struct TestbedState { pub draw_colls: bool, pub highlighted_body: Option, pub character_body: Option, + #[cfg(feature = "dim3")] + pub vehicle_controller: Option, // pub grabbed_object: Option, // pub grabbed_object_constraint: Option, pub grabbed_object_plane: (Point3, Vector3), @@ -178,6 +182,8 @@ impl TestbedApp { draw_colls: false, highlighted_body: None, character_body: None, + #[cfg(feature = "dim3")] + vehicle_controller: None, // grabbed_object: None, // grabbed_object_constraint: None, grabbed_object_plane: (Point3::origin(), na::zero()), @@ -456,6 +462,11 @@ impl<'a, 'b, 'c, 'd, 'e, 'f> Testbed<'a, 'b, 'c, 'd, 'e, 'f> { self.state.character_body = Some(handle); } + #[cfg(feature = "dim3")] + pub fn set_vehicle_controller(&mut self, controller: DynamicRayCastVehicleController) { + self.state.vehicle_controller = Some(controller); + } + pub fn allow_grabbing_behind_ground(&mut self, allow: bool) { self.state.can_grab_behind_ground = allow; } @@ -511,8 +522,12 @@ impl<'a, 'b, 'c, 'd, 'e, 'f> Testbed<'a, 'b, 'c, 'd, 'e, 'f> { .action_flags .set(TestbedActionFlags::RESET_WORLD_GRAPHICS, true); - self.state.character_body = None; self.state.highlighted_body = None; + self.state.character_body = None; + #[cfg(feature = "dim3")] + { + self.state.vehicle_controller = None; + } #[cfg(all(feature = "dim2", feature = "other-backends"))] { @@ -624,6 +639,50 @@ impl<'a, 'b, 'c, 'd, 'e, 'f> Testbed<'a, 'b, 'c, 'd, 'e, 'f> { self.plugins.0.push(Box::new(plugin)); } + #[cfg(feature = "dim3")] + fn update_vehicle_controller(&mut self, events: &Input) { + if self.state.running == RunMode::Stop { + return; + } + + if let Some(vehicle) = &mut self.state.vehicle_controller { + let mut engine_force = 0.0; + let mut steering_angle = 0.0; + + for key in events.get_pressed() { + match *key { + KeyCode::Right => { + steering_angle += -0.1; + } + KeyCode::Left => { + steering_angle += 0.1; + } + KeyCode::Up => { + engine_force += 0.1; + } + KeyCode::Down => { + engine_force += -0.1; + } + _ => {} + } + } + + let wheels = vehicle.wheels_mut(); + wheels[0].engine_force = engine_force; + wheels[0].steering = steering_angle; + wheels[1].engine_force = engine_force; + wheels[1].steering = steering_angle; + + vehicle.update_vehicle( + self.harness.physics.integration_parameters.dt, + &mut self.harness.physics.bodies, + &self.harness.physics.colliders, + &self.harness.physics.query_pipeline, + QueryFilter::exclude_dynamic().exclude_rigid_body(vehicle.chassis), + ); + } + } + fn update_character_controller(&mut self, events: &Input) { if self.state.running == RunMode::Stop { return; @@ -1063,6 +1122,10 @@ fn update_testbed( testbed.handle_common_events(&*keys); testbed.update_character_controller(&*keys); + #[cfg(feature = "dim3")] + { + testbed.update_vehicle_controller(&*keys); + } } // Update UI -- cgit From 8ef8680817af5b098c65ff5a8b6a1db8e629988a Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 11 Dec 2022 15:18:11 +0100 Subject: Update parry and changelog --- src_testbed/testbed.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src_testbed') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 50b77c8..1052c55 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -652,16 +652,16 @@ impl<'a, 'b, 'c, 'd, 'e, 'f> Testbed<'a, 'b, 'c, 'd, 'e, 'f> { for key in events.get_pressed() { match *key { KeyCode::Right => { - steering_angle += -0.1; + steering_angle += -0.7; } KeyCode::Left => { - steering_angle += 0.1; + steering_angle += 0.7; } KeyCode::Up => { - engine_force += 0.1; + engine_force += 30.0; } KeyCode::Down => { - engine_force += -0.1; + engine_force += -30.0; } _ => {} } @@ -1308,10 +1308,10 @@ fn update_testbed( || state.prev_flags.contains(TestbedStateFlags::WIREFRAME) != state.flags.contains(TestbedStateFlags::WIREFRAME) { - // graphics.toggle_wireframe_mode( - // &harness.physics.colliders, - // state.flags.contains(TestbedStateFlags::WIREFRAME), - // ) + graphics.toggle_wireframe_mode( + &harness.physics.colliders, + state.flags.contains(TestbedStateFlags::WIREFRAME), + ) } if state.prev_flags.contains(TestbedStateFlags::SLEEP) -- cgit From a1e255dbcdbfde270df32eeda59360493649c73f Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 11 Dec 2022 17:52:51 +0100 Subject: Fix warnings --- src_testbed/harness/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src_testbed') diff --git a/src_testbed/harness/mod.rs b/src_testbed/harness/mod.rs index 91d4da9..9608592 100644 --- a/src_testbed/harness/mod.rs +++ b/src_testbed/harness/mod.rs @@ -215,7 +215,7 @@ impl Harness { &mut physics.impulse_joints, &mut physics.multibody_joints, &mut physics.ccd_solver, - &mut physics.query_pipeline, + Some(&mut physics.query_pipeline), &*physics.hooks, event_handler, ); -- cgit