aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2020-12-31 11:37:42 +0100
committerCrozet Sébastien <developer@crozet.re>2020-12-31 11:37:42 +0100
commit1feac2e02d8779a1a03c9c16d5fbe4fd79c9324a (patch)
tree4aa2cc0ce5c4c11ff5c19ef65b8c2fd9e73e1a6e /src
parent967145a9492175be59e8db33299b1687d69d84e2 (diff)
downloadrapier-1feac2e02d8779a1a03c9c16d5fbe4fd79c9324a.tar.gz
rapier-1feac2e02d8779a1a03c9c16d5fbe4fd79c9324a.tar.bz2
rapier-1feac2e02d8779a1a03c9c16d5fbe4fd79c9324a.zip
Restore contact events.
Diffstat (limited to 'src')
-rw-r--r--src/geometry/contact_pair.rs15
-rw-r--r--src/geometry/narrow_phase.rs25
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;
+ }
});
}