diff options
| author | Crozet Sébastien <developer@crozet.re> | 2020-12-31 11:37:42 +0100 |
|---|---|---|
| committer | Crozet Sébastien <developer@crozet.re> | 2020-12-31 11:37:42 +0100 |
| commit | 1feac2e02d8779a1a03c9c16d5fbe4fd79c9324a (patch) | |
| tree | 4aa2cc0ce5c4c11ff5c19ef65b8c2fd9e73e1a6e /src | |
| parent | 967145a9492175be59e8db33299b1687d69d84e2 (diff) | |
| download | rapier-1feac2e02d8779a1a03c9c16d5fbe4fd79c9324a.tar.gz rapier-1feac2e02d8779a1a03c9c16d5fbe4fd79c9324a.tar.bz2 rapier-1feac2e02d8779a1a03c9c16d5fbe4fd79c9324a.zip | |
Restore contact events.
Diffstat (limited to 'src')
| -rw-r--r-- | src/geometry/contact_pair.rs | 15 | ||||
| -rw-r--r-- | src/geometry/narrow_phase.rs | 25 |
2 files changed, 24 insertions, 16 deletions
diff --git a/src/geometry/contact_pair.rs b/src/geometry/contact_pair.rs index 3ad4f70..b2ae812 100644 --- a/src/geometry/contact_pair.rs +++ b/src/geometry/contact_pair.rs @@ -62,6 +62,7 @@ pub struct ContactPair { /// /// All contact manifold contain themselves contact points between the colliders. pub manifolds: Vec<ContactManifold>, + pub has_any_active_contact: bool, pub(crate) workspace: Option<ContactManifoldsWorkspace>, } @@ -69,23 +70,11 @@ impl ContactPair { pub(crate) fn new(pair: ColliderPair) -> Self { Self { pair, + has_any_active_contact: false, manifolds: Vec::new(), workspace: None, } } - - /// Does this contact pair have any active contact? - /// - /// An active contact is a contact that may result in a non-zero contact force. - pub fn has_any_active_contact(&self) -> bool { - for manifold in &self.manifolds { - if manifold.data.num_active_contacts() != 0 { - return true; - } - } - - false - } } #[derive(Clone, Debug)] diff --git a/src/geometry/narrow_phase.rs b/src/geometry/narrow_phase.rs index 5d9cca5..fc6d5db 100644 --- a/src/geometry/narrow_phase.rs +++ b/src/geometry/narrow_phase.rs @@ -369,7 +369,7 @@ impl NarrowPhase { // Emit a contact stopped event if we had a contact before removing the edge. // Also wake up the dynamic bodies that were in contact. if let Some(ctct) = contact_pair { - if ctct.has_any_active_contact() { + if ctct.has_any_active_contact { bodies.wake_up(co1.parent, true); bodies.wake_up(co2.parent, true); @@ -524,14 +524,16 @@ impl NarrowPhase { &mut pair.workspace, ); - // TODO: don't write this everytime? + let mut has_any_active_contact = false; + for manifold in &mut pair.manifolds { manifold.data.solver_contacts.clear(); manifold.data.body_pair = BodyPair::new(co1.parent(), co2.parent()); manifold.data.solver_flags = solver_flags; manifold.data.normal = co1.position() * manifold.local_n1; - // Sort contacts and generate solver contacts. + // Sort contacts to keep only these with distances bellow + // the prediction, and generate solver contacts. let mut first_inactive_index = manifold.points.len(); while manifold.data.num_active_contacts() != first_inactive_index { @@ -551,6 +553,7 @@ impl NarrowPhase { // TODO: apply the user-defined contact modification/removal, if needed. manifold.data.solver_contacts.push(solver_contact); + has_any_active_contact = true; continue; } @@ -563,6 +566,22 @@ impl NarrowPhase { first_inactive_index -= 1; } } + + if has_any_active_contact != pair.has_any_active_contact { + if has_any_active_contact { + events.handle_contact_event(ContactEvent::Started( + pair.pair.collider1, + pair.pair.collider2, + )); + } else { + events.handle_contact_event(ContactEvent::Stopped( + pair.pair.collider1, + pair.pair.collider2, + )); + } + + pair.has_any_active_contact = has_any_active_contact; + } }); } |
