diff options
| author | Sébastien Crozet <developer@crozet.re> | 2021-04-01 11:00:27 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-01 11:00:27 +0200 |
| commit | f8536e73fc092da5ded5c793d513c59296949aff (patch) | |
| tree | 50af9e4312b22ea2c1cabc0e6d80dc73e59b3104 /src_testbed/physx_backend.rs | |
| parent | 4b637c66ca40695f97f1ebdc38965e0d83ac5934 (diff) | |
| parent | cc3f16eb85f23a86ddd9d182d967cb12acc32354 (diff) | |
| download | rapier-f8536e73fc092da5ded5c793d513c59296949aff.tar.gz rapier-f8536e73fc092da5ded5c793d513c59296949aff.tar.bz2 rapier-f8536e73fc092da5ded5c793d513c59296949aff.zip | |
Merge pull request #157 from dimforge/ccd
Implement Continuous Collision Detection
Diffstat (limited to 'src_testbed/physx_backend.rs')
| -rw-r--r-- | src_testbed/physx_backend.rs | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/src_testbed/physx_backend.rs b/src_testbed/physx_backend.rs index 02b57c3..8a3b155 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,15 +160,24 @@ 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, solver_type: SolverType::PGS, friction_type, + ccd_max_passes: integration_parameters.max_ccd_substeps as u32, ..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<PxScene> = physics.create(scene_desc).unwrap(); let mut rapier2dynamic = HashMap::new(); let mut rapier2static = HashMap::new(); @@ -231,13 +240,13 @@ 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 .colliders() .iter() - .map(|h| colliders[*h].density()) + .map(|h| colliders[*h].density().unwrap_or(0.0)) .collect(); unsafe { @@ -248,6 +257,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 +725,8 @@ impl AdvanceCallback<PxArticulationLink, PxRigidDynamic> 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 +} |
