aboutsummaryrefslogtreecommitdiff
path: root/src_testbed/physx_backend.rs
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2021-03-26 18:16:27 +0100
committerCrozet Sébastien <developer@crozet.re>2021-03-26 18:16:27 +0100
commit97157c9423f3360c5e941b4065377689221014ae (patch)
tree707adf6e1feab0a9b7752d292baa161de790a8a1 /src_testbed/physx_backend.rs
parent326469a1df9d8502903d88fe8e47a67e9e7c9edd (diff)
downloadrapier-97157c9423f3360c5e941b4065377689221014ae.tar.gz
rapier-97157c9423f3360c5e941b4065377689221014ae.tar.bz2
rapier-97157c9423f3360c5e941b4065377689221014ae.zip
First working version of non-linear CCD based on single-substep motion-clamping.
Diffstat (limited to 'src_testbed/physx_backend.rs')
-rw-r--r--src_testbed/physx_backend.rs38
1 files changed, 34 insertions, 4 deletions
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<PxScene> = 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<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
+}