From 9bf1321f8f1d2e116f44c2461a53f302c4ef4171 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 8 Dec 2020 17:31:49 +0100 Subject: Outsource the contact manifold, SAT, and some shapes. --- src_testbed/testbed.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 4fac8e1..60fb5d9 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -1521,8 +1521,8 @@ fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet) } else { Point3::new(1.0, 0.0, 0.0) }; - let pos1 = colliders[manifold.pair.collider1].position(); - let pos2 = colliders[manifold.pair.collider2].position(); + let pos1 = colliders[manifold.data.pair.collider1].position(); + let pos2 = colliders[manifold.data.pair.collider2].position(); let start = pos1 * pt.local_p1; let end = pos2 * pt.local_p2; let n = pos1 * manifold.local_n1; -- cgit From 29717c2887b2db39faf9c25053730b661dc5da2b Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Thu, 17 Dec 2020 13:23:00 +0100 Subject: Externalize the proximity code (renamed intersection). --- src_testbed/testbed.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 60fb5d9..2a72414 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -202,11 +202,11 @@ impl Testbed { }; let contact_channel = crossbeam::channel::unbounded(); - let proximity_channel = crossbeam::channel::unbounded(); - let event_handler = ChannelEventCollector::new(proximity_channel.0, contact_channel.0); + let intersection_channel = crossbeam::channel::unbounded(); + let event_handler = ChannelEventCollector::new(intersection_channel.0, contact_channel.0); let events = PhysicsEvents { contact_events: contact_channel.1, - proximity_events: proximity_channel.1, + intersection_events: intersection_channel.1, }; let physics = PhysicsState::new(); -- cgit From 0fb4b4faefc59213b2731b9b3f7fa4bfde8212ba Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Fri, 18 Dec 2020 17:08:00 +0100 Subject: Use Isometry::inv_mul. --- src_testbed/testbed.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 2a72414..cc4262f 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -745,7 +745,7 @@ impl Testbed { .unwrap() .position(); let attach1 = self.cursor_pos; - let attach2 = body_pos.inverse() * attach1; + let attach2 = body_pos.inv_mul(&attach1); if let Some(ground) = self.ground_handle { let joint = MouseConstraint::new( -- cgit From 5876a262daa3b6544f132e6654923c2bfabe35d9 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Wed, 30 Dec 2020 11:44:08 +0100 Subject: Remove the useless manifold.data.pair field. --- src_testbed/testbed.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index cc4262f..5924553 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -1521,8 +1521,8 @@ fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet) } else { Point3::new(1.0, 0.0, 0.0) }; - let pos1 = colliders[manifold.data.pair.collider1].position(); - let pos2 = colliders[manifold.data.pair.collider2].position(); + let pos1 = colliders[pair.pair.collider1].position(); + let pos2 = colliders[pair.pair.collider2].position(); let start = pos1 * pt.local_p1; let end = pos2 * pt.local_p2; let n = pos1 * manifold.local_n1; -- cgit From 967145a9492175be59e8db33299b1687d69d84e2 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Thu, 31 Dec 2020 11:16:03 +0100 Subject: Perform contact sorting in the narrow-phase directly. --- src_testbed/testbed.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 5924553..1ab82da 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -1515,7 +1515,7 @@ 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 pt in manifold.all_contacts() { + for pt in manifold.contacts() { let color = if pt.dist > 0.0 { Point3::new(0.0, 0.0, 1.0) } else { -- cgit From 7b098606c230256c72b73291c15cbd5fabe02653 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Thu, 31 Dec 2020 16:30:38 +0100 Subject: QueryPipeline: add shape casting, point projection, and intersection queries. --- src_testbed/testbed.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 1ab82da..b1a529f 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -1032,10 +1032,12 @@ impl Testbed { &self.physics.colliders, &ray, f32::MAX, + true, InteractionGroups::all(), ); - if let Some((_, collider, _)) = hit { + if let Some((handle, _)) = hit { + let collider = &self.physics.colliders[handle]; if self.physics.bodies[collider.parent()].is_dynamic() { self.state.highlighted_body = Some(collider.parent()); for node in self.graphics.body_nodes_mut(collider.parent()).unwrap() { -- cgit From 00da4aaa42cc921bbd8c469b45c5c1e304f46260 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 5 Jan 2021 15:34:48 +0100 Subject: Add compound shape support. --- src_testbed/testbed.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index b1a529f..10b3a0a 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -17,7 +17,7 @@ use kiss3d::planar_camera::PlanarCamera; use kiss3d::post_processing::PostProcessingEffect; use kiss3d::text::Font; use kiss3d::window::{State, Window}; -use na::{self, Point2, Point3, Vector3}; +use na::{self, Isometry3, Point2, Point3, Vector3}; use rapier::dynamics::{ ActivationStatus, IntegrationParameters, JointSet, RigidBodyHandle, RigidBodySet, }; @@ -1525,9 +1525,13 @@ fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet) }; let pos1 = colliders[pair.pair.collider1].position(); let pos2 = colliders[pair.pair.collider2].position(); - let start = pos1 * pt.local_p1; - let end = pos2 * pt.local_p2; - let n = pos1 * manifold.local_n1; + let start = + pos1 * manifold.subshape_pos1.unwrap_or(Isometry3::identity()) * pt.local_p1; + let end = + pos2 * manifold.subshape_pos2.unwrap_or(Isometry3::identity()) * pt.local_p2; + let n = pos1 + * manifold.subshape_pos1.unwrap_or(Isometry3::identity()) + * manifold.local_n1; use crate::engine::GraphicsWindow; window.draw_graphics_line(&start, &(start + n * 0.4), &Point3::new(0.5, 1.0, 0.5)); -- cgit From 1e9a962d34fa5143404d1dae1bfa0243e3d8a6a0 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 5 Jan 2021 17:07:26 +0100 Subject: Testbed physx backend: re-add joints. --- src_testbed/testbed.rs | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 10b3a0a..bef9b8f 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -1126,6 +1126,14 @@ impl State for Testbed { if self.state.selected_example != prev_example { self.physics.integration_parameters = IntegrationParameters::default(); + if self.state.selected_backend == PHYSX_BACKEND_PATCH_FRICTION + || self.state.selected_backend == PHYSX_BACKEND_TWO_FRICTION_DIR + { + std::mem::swap( + &mut self.physics.integration_parameters.max_velocity_iterations, + &mut self.physics.integration_parameters.max_position_iterations, + ) + } } self.builders[self.state.selected_example].1(self); -- cgit From 261ed1ebed04fb594f612b66811350f63b73f104 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Wed, 6 Jan 2021 12:53:26 +0100 Subject: Fix 2D compilation. --- src_testbed/testbed.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index bef9b8f..6acfede 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -17,14 +17,14 @@ use kiss3d::planar_camera::PlanarCamera; use kiss3d::post_processing::PostProcessingEffect; use kiss3d::text::Font; use kiss3d::window::{State, Window}; -use na::{self, Isometry3, Point2, Point3, Vector3}; +use na::{self, Point2, Point3, Vector3}; use rapier::dynamics::{ ActivationStatus, IntegrationParameters, JointSet, RigidBodyHandle, RigidBodySet, }; use rapier::geometry::{BroadPhase, ColliderHandle, ColliderSet, NarrowPhase}; #[cfg(feature = "dim3")] use rapier::geometry::{InteractionGroups, Ray}; -use rapier::math::Vector; +use rapier::math::{Isometry, Vector}; use rapier::pipeline::{ChannelEventCollector, PhysicsPipeline, QueryPipeline}; #[cfg(all(feature = "dim2", feature = "other-backends"))] @@ -1126,8 +1126,9 @@ impl State for Testbed { if self.state.selected_example != prev_example { self.physics.integration_parameters = IntegrationParameters::default(); - if self.state.selected_backend == PHYSX_BACKEND_PATCH_FRICTION - || self.state.selected_backend == PHYSX_BACKEND_TWO_FRICTION_DIR + if cfg!(feature = "dim3") + && (self.state.selected_backend == PHYSX_BACKEND_PATCH_FRICTION + || self.state.selected_backend == PHYSX_BACKEND_TWO_FRICTION_DIR) { std::mem::swap( &mut self.physics.integration_parameters.max_velocity_iterations, @@ -1534,11 +1535,11 @@ fn draw_contacts(window: &mut Window, nf: &NarrowPhase, colliders: &ColliderSet) let pos1 = colliders[pair.pair.collider1].position(); let pos2 = colliders[pair.pair.collider2].position(); let start = - pos1 * manifold.subshape_pos1.unwrap_or(Isometry3::identity()) * pt.local_p1; + pos1 * manifold.subshape_pos1.unwrap_or(Isometry::identity()) * pt.local_p1; let end = - pos2 * manifold.subshape_pos2.unwrap_or(Isometry3::identity()) * pt.local_p2; + pos2 * manifold.subshape_pos2.unwrap_or(Isometry::identity()) * pt.local_p2; let n = pos1 - * manifold.subshape_pos1.unwrap_or(Isometry3::identity()) + * manifold.subshape_pos1.unwrap_or(Isometry::identity()) * manifold.local_n1; use crate::engine::GraphicsWindow; -- cgit From 99c2184e134b40cca9cb22fe93a95a64295ae048 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Fri, 22 Jan 2021 16:33:31 +0100 Subject: Fix regressions introduced by the merge with master. --- src_testbed/testbed.rs | 68 +++++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 25 deletions(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index ae73929..461648c 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -25,7 +25,6 @@ use rapier::geometry::{ColliderHandle, ColliderSet, NarrowPhase}; #[cfg(feature = "dim3")] use rapier::geometry::{InteractionGroups, Ray}; use rapier::math::{Isometry, Vector}; -use rapier::pipeline::{ChannelEventCollector, PhysicsPipeline, QueryPipeline}; #[cfg(all(feature = "dim2", feature = "other-backends"))] use crate::box2d_backend::Box2dWorld; @@ -284,11 +283,11 @@ impl Testbed { || self.state.selected_backend == PHYSX_BACKEND_TWO_FRICTION_DIR { self.physx = Some(PhysxWorld::from_rapier( - physics.gravity, - &physics.integration_parameters, - &physics.bodies, - &physics.colliders, - &physics.joints, + self.harness.physics.gravity, + &self.harness.physics.integration_parameters, + &self.harness.physics.bodies, + &self.harness.physics.colliders, + &self.harness.physics.joints, self.state.selected_backend == PHYSX_BACKEND_TWO_FRICTION_DIR, self.harness.state.num_threads, )); @@ -299,10 +298,10 @@ impl Testbed { { if self.state.selected_backend == NPHYSICS_BACKEND { self.nphysics = Some(NPhysicsWorld::from_rapier( - physics.gravity, - &physics.bodies, - &physics.colliders, - &physics.joints, + self.harness.physics.gravity, + &self.harness.physics.bodies, + &self.harness.physics.colliders, + &self.harness.physics.joints, )); } } @@ -501,7 +500,7 @@ impl Testbed { // println!("Step"); self.physx.as_mut().unwrap().step( &mut self.harness.physics.pipeline.counters, - &physics.integration_parameters, + &self.harness.physics.integration_parameters, ); self.physx.as_mut().unwrap().sync( &mut self.harness.physics.bodies, @@ -515,7 +514,7 @@ impl Testbed { if self.state.selected_backend == NPHYSICS_BACKEND { self.nphysics.as_mut().unwrap().step( &mut self.harness.physics.pipeline.counters, - &physics.integration_parameters, + &self.harness.physics.integration_parameters, ); self.nphysics.as_mut().unwrap().sync( &mut self.harness.physics.bodies, @@ -986,7 +985,7 @@ impl Testbed { ); if let Some((handle, _)) = hit { - let collider = &self.physics.colliders[handle]; + let collider = &physics.colliders[handle]; if physics.bodies[collider.parent()].is_dynamic() { self.state.highlighted_body = Some(collider.parent()); for node in self.graphics.body_nodes_mut(collider.parent()).unwrap() { @@ -1073,9 +1072,28 @@ impl State for Testbed { .action_flags .set(TestbedActionFlags::EXAMPLE_CHANGED, false); self.clear(window); + self.harness.clear_callbacks(); if self.state.selected_example != prev_example { self.harness.physics.integration_parameters = IntegrationParameters::default(); + + if cfg!(feature = "dim3") + && (self.state.selected_backend == PHYSX_BACKEND_PATCH_FRICTION + || self.state.selected_backend == PHYSX_BACKEND_TWO_FRICTION_DIR) + { + std::mem::swap( + &mut self + .harness + .physics + .integration_parameters + .max_velocity_iterations, + &mut self + .harness + .physics + .integration_parameters + .max_position_iterations, + ) + } } self.builders[self.state.selected_example].1(self); @@ -1269,13 +1287,13 @@ impl State for Testbed { { // println!("Step"); self.physx.as_mut().unwrap().step( - &mut physics.pipeline.counters, - &physics.integration_parameters, + &mut self.harness.physics.pipeline.counters, + &self.harness.physics.integration_parameters, + ); + self.physx.as_mut().unwrap().sync( + &mut self.harness.physics.bodies, + &mut self.harness.physics.colliders, ); - self.physx - .as_mut() - .unwrap() - .sync(&mut physics.bodies, &mut physics.colliders); } } @@ -1283,13 +1301,13 @@ impl State for Testbed { { if self.state.selected_backend == NPHYSICS_BACKEND { self.nphysics.as_mut().unwrap().step( - &mut physics.pipeline.counters, - &physics.integration_parameters, + &mut self.harness.physics.pipeline.counters, + &self.harness.physics.integration_parameters, + ); + self.nphysics.as_mut().unwrap().sync( + &mut self.harness.physics.bodies, + &mut self.harness.physics.colliders, ); - self.nphysics - .as_mut() - .unwrap() - .sync(&mut physics.bodies, &mut physics.colliders); } } -- cgit From b779eb261e7c3e816c8b586f1f496dcd17dbf700 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Fri, 22 Jan 2021 16:43:16 +0100 Subject: Fix compilation in 2D. --- src_testbed/testbed.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 461648c..6eb938a 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -269,10 +269,10 @@ impl Testbed { { if self.state.selected_backend == BOX2D_BACKEND { self.box2d = Some(Box2dWorld::from_rapier( - physics.gravity, - &physics.bodies, - &physics.colliders, - &physics.joints, + self.harness.physics.gravity, + &self.harness.physics.bodies, + &self.harness.physics.colliders, + &self.harness.physics.joints, )); } } @@ -483,7 +483,7 @@ impl Testbed { if self.state.selected_backend == BOX2D_BACKEND { self.box2d.as_mut().unwrap().step( &mut self.harness.physics.pipeline.counters, - &physics.integration_parameters, + &self.harness.physics.integration_parameters, ); self.box2d.as_mut().unwrap().sync( &mut self.harness.physics.bodies, @@ -1270,13 +1270,13 @@ impl State for Testbed { { if self.state.selected_backend == BOX2D_BACKEND { self.box2d.as_mut().unwrap().step( - &mut physics.pipeline.counters, - &physics.integration_parameters, + &mut self.harness.physics.pipeline.counters, + &self.harness.physics.integration_parameters, + ); + self.box2d.as_mut().unwrap().sync( + &mut self.harness.physics.bodies, + &mut self.harness.physics.colliders, ); - self.box2d - .as_mut() - .unwrap() - .sync(&mut physics.bodies, &mut physics.colliders); } } -- cgit From 90db26eb501b65cda362dcef34777106f533248b Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Sat, 23 Jan 2021 13:34:03 +0100 Subject: Fix warnings in tests and testbed. --- src_testbed/testbed.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src_testbed/testbed.rs') diff --git a/src_testbed/testbed.rs b/src_testbed/testbed.rs index 6eb938a..506132c 100644 --- a/src_testbed/testbed.rs +++ b/src_testbed/testbed.rs @@ -35,8 +35,9 @@ use crate::nphysics_backend::NPhysicsWorld; use crate::physx_backend::PhysxWorld; const RAPIER_BACKEND: usize = 0; +#[cfg(feature = "other-backends")] const NPHYSICS_BACKEND: usize = 1; -#[cfg(feature = "dim2")] +#[cfg(all(feature = "dim2", feature = "other-backends"))] const BOX2D_BACKEND: usize = 2; pub(crate) const PHYSX_BACKEND_PATCH_FRICTION: usize = 2; pub(crate) const PHYSX_BACKEND_TWO_FRICTION_DIR: usize = 3; -- cgit