From a967ace7d426eea11b4132328574cc3a48790ea5 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Mon, 8 Mar 2021 18:27:06 +0100 Subject: Start implementing SAPLayer creation and insertion. --- src_testbed/physx_backend.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src_testbed/physx_backend.rs') diff --git a/src_testbed/physx_backend.rs b/src_testbed/physx_backend.rs index 02b57c3..dab4aec 100644 --- a/src_testbed/physx_backend.rs +++ b/src_testbed/physx_backend.rs @@ -237,7 +237,7 @@ impl PhysxWorld { let densities: Vec<_> = rb .colliders() .iter() - .map(|h| colliders[*h].density()) + .map(|h| colliders[*h].density().unwrap_or(0.0)) .collect(); unsafe { -- cgit From 97157c9423f3360c5e941b4065377689221014ae Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Fri, 26 Mar 2021 18:16:27 +0100 Subject: First working version of non-linear CCD based on single-substep motion-clamping. --- src_testbed/physx_backend.rs | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) (limited to 'src_testbed/physx_backend.rs') diff --git a/src_testbed/physx_backend.rs b/src_testbed/physx_backend.rs index dab4aec..42449ea 100644 --- a/src_testbed/physx_backend.rs +++ b/src_testbed/physx_backend.rs @@ -13,8 +13,8 @@ use physx::prelude::*; use physx::scene::FrictionType; use physx::traits::Class; use physx_sys::{ - PxBitAndByte, PxConvexFlags, PxConvexMeshGeometryFlags, PxHeightFieldSample, - PxMeshGeometryFlags, PxMeshScale_new, PxRigidActor, + FilterShaderCallbackInfo, PxBitAndByte, PxConvexFlags, PxConvexMeshGeometryFlags, + PxHeightFieldSample, PxMeshGeometryFlags, PxMeshScale_new, PxRigidActor, }; use rapier::counters::Counters; use rapier::dynamics::{ @@ -160,7 +160,7 @@ impl PhysxWorld { FrictionType::Patch }; - let scene_desc = SceneDescriptor { + let mut scene_desc = SceneDescriptor { gravity: gravity.into_physx(), thread_count: num_threads as u32, broad_phase_type: BroadPhaseType::AutomaticBoxPruning, @@ -169,6 +169,14 @@ impl PhysxWorld { ..SceneDescriptor::new(()) }; + let ccd_enabled = bodies.iter().any(|(_, rb)| rb.is_ccd_enabled()); + + if ccd_enabled { + scene_desc.simulation_filter_shader = + FilterShaderDescriptor::CallDefaultFirst(ccd_filter_shader); + scene_desc.flags.insert(SceneFlag::EnableCcd); + } + let mut scene: Owner = physics.create(scene_desc).unwrap(); let mut rapier2dynamic = HashMap::new(); let mut rapier2static = HashMap::new(); @@ -231,7 +239,7 @@ impl PhysxWorld { } } - // Update mass properties. + // Update mass properties and CCD flags. for (rapier_handle, actor) in rapier2dynamic.iter_mut() { let rb = &bodies[*rapier_handle]; let densities: Vec<_> = rb @@ -248,6 +256,23 @@ impl PhysxWorld { std::ptr::null(), false, ); + + if rb.is_ccd_enabled() { + physx_sys::PxRigidBody_setRigidBodyFlag_mut( + std::mem::transmute(actor.as_mut()), + RigidBodyFlag::EnableCCD as u32, + true, + ); + // physx_sys::PxRigidBody_setMinCCDAdvanceCoefficient_mut( + // std::mem::transmute(actor.as_mut()), + // 0.0, + // ); + // physx_sys::PxRigidBody_setRigidBodyFlag_mut( + // std::mem::transmute(actor.as_mut()), + // RigidBodyFlag::EnableCCDFriction as u32, + // true, + // ); + } } } @@ -699,3 +724,8 @@ impl AdvanceCallback for OnAdvance { ) { } } + +unsafe extern "C" fn ccd_filter_shader(data: *mut FilterShaderCallbackInfo) -> u16 { + (*(*data).pairFlags).mBits |= physx_sys::PxPairFlag::eDETECT_CCD_CONTACT as u16; + 0 +} -- cgit From a733f97028f5cd532212572f9561ab64e09f002b Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Mon, 29 Mar 2021 17:21:49 +0200 Subject: Implement the ability to run multiple CCD substeps. --- src_testbed/physx_backend.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'src_testbed/physx_backend.rs') diff --git a/src_testbed/physx_backend.rs b/src_testbed/physx_backend.rs index 42449ea..8a3b155 100644 --- a/src_testbed/physx_backend.rs +++ b/src_testbed/physx_backend.rs @@ -166,6 +166,7 @@ impl PhysxWorld { broad_phase_type: BroadPhaseType::AutomaticBoxPruning, solver_type: SolverType::PGS, friction_type, + ccd_max_passes: integration_parameters.max_ccd_substeps as u32, ..SceneDescriptor::new(()) }; -- cgit