aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/ccd
diff options
context:
space:
mode:
Diffstat (limited to 'src/dynamics/ccd')
-rw-r--r--src/dynamics/ccd/ccd_solver.rs30
-rw-r--r--src/dynamics/ccd/toi_entry.rs2
2 files changed, 22 insertions, 10 deletions
diff --git a/src/dynamics/ccd/ccd_solver.rs b/src/dynamics/ccd/ccd_solver.rs
index b348283..354f183 100644
--- a/src/dynamics/ccd/ccd_solver.rs
+++ b/src/dynamics/ccd/ccd_solver.rs
@@ -10,6 +10,7 @@ use crate::geometry::{
use crate::math::Real;
use crate::parry::utils::SortedPair;
use crate::pipeline::{EventHandler, QueryPipeline, QueryPipelineMode};
+use crate::prelude::{ActiveEvents, ColliderFlags};
use parry::query::{DefaultQueryDispatcher, QueryDispatcher};
use parry::utils::hashmap::HashMap;
use std::collections::BinaryHeap;
@@ -66,7 +67,7 @@ impl CCDSolver {
&RigidBodyCcd,
&RigidBodyMassProps,
) = bodies.index_bundle(handle.0);
- let local_com = &mprops.mass_properties.local_com;
+ let local_com = &mprops.local_mprops.local_com;
let min_toi = (ccd.ccd_thickness
* 0.15
@@ -272,7 +273,8 @@ impl CCDSolver {
Colliders: ComponentSetOption<ColliderParent>
+ ComponentSet<ColliderPosition>
+ ComponentSet<ColliderShape>
- + ComponentSet<ColliderType>,
+ + ComponentSet<ColliderType>
+ + ComponentSet<ColliderFlags>,
{
let mut frozen = HashMap::<_, Real>::default();
let mut all_toi = BinaryHeap::new();
@@ -522,10 +524,16 @@ impl CCDSolver {
// - If the intersection isn't active anymore, and it wasn't intersecting
// before, then we need to generate one interaction-start and one interaction-stop
// events because it will never be detected by the narrow-phase because of tunneling.
- let (co_pos1, co_shape1): (&ColliderPosition, &ColliderShape) =
- colliders.index_bundle(toi.c1.0);
- let (co_pos2, co_shape2): (&ColliderPosition, &ColliderShape) =
- colliders.index_bundle(toi.c2.0);
+ let (co_pos1, co_shape1, co_flags1): (
+ &ColliderPosition,
+ &ColliderShape,
+ &ColliderFlags,
+ ) = colliders.index_bundle(toi.c1.0);
+ let (co_pos2, co_shape2, co_flags2): (
+ &ColliderPosition,
+ &ColliderShape,
+ &ColliderFlags,
+ ) = colliders.index_bundle(toi.c2.0);
let co_next_pos1 = if let Some(b1) = toi.b1 {
let co_parent1: &ColliderParent = colliders.get(toi.c1.0).unwrap();
@@ -535,7 +543,7 @@ impl CCDSolver {
&RigidBodyMassProps,
) = bodies.index_bundle(b1.0);
- let local_com1 = &rb_mprops1.mass_properties.local_com;
+ let local_com1 = &rb_mprops1.local_mprops.local_com;
let frozen1 = frozen.get(&b1);
let pos1 = frozen1
.map(|t| rb_vels1.integrate(*t, &rb_pos1.position, local_com1))
@@ -553,7 +561,7 @@ impl CCDSolver {
&RigidBodyMassProps,
) = bodies.index_bundle(b2.0);
- let local_com2 = &rb_mprops2.mass_properties.local_com;
+ let local_com2 = &rb_mprops2.local_mprops.local_com;
let frozen2 = frozen.get(&b2);
let pos2 = frozen2
.map(|t| rb_vels2.integrate(*t, &rb_pos2.position, local_com2))
@@ -575,7 +583,11 @@ impl CCDSolver {
.intersection_test(&next_coll_pos12, co_shape1.as_ref(), co_shape2.as_ref())
.unwrap_or(false);
- if !intersect_before && !intersect_after {
+ if !intersect_before
+ && !intersect_after
+ && (co_flags1.active_events | co_flags2.active_events)
+ .contains(ActiveEvents::INTERSECTION_EVENTS)
+ {
// Emit one intersection-started and one intersection-stopped event.
events.handle_intersection_event(IntersectionEvent::new(toi.c1, toi.c2, true));
events.handle_intersection_event(IntersectionEvent::new(toi.c1, toi.c2, false));
diff --git a/src/dynamics/ccd/toi_entry.rs b/src/dynamics/ccd/toi_entry.rs
index 4637940..78396c0 100644
--- a/src/dynamics/ccd/toi_entry.rs
+++ b/src/dynamics/ccd/toi_entry.rs
@@ -173,7 +173,7 @@ impl TOIEntry {
if ccd.ccd_active {
NonlinearRigidMotion::new(
poss.position,
- mprops.mass_properties.local_com,
+ mprops.local_mprops.local_com,
vels.linvel,
vels.angvel,
)