aboutsummaryrefslogtreecommitdiff
path: root/src/geometry
diff options
context:
space:
mode:
Diffstat (limited to 'src/geometry')
-rw-r--r--src/geometry/broad_phase_multi_sap.rs10
-rw-r--r--src/geometry/narrow_phase.rs28
2 files changed, 22 insertions, 16 deletions
diff --git a/src/geometry/broad_phase_multi_sap.rs b/src/geometry/broad_phase_multi_sap.rs
index b0a274d..c27e5aa 100644
--- a/src/geometry/broad_phase_multi_sap.rs
+++ b/src/geometry/broad_phase_multi_sap.rs
@@ -1,5 +1,5 @@
use crate::data::pubsub::Subscription;
-use crate::dynamics::RigidBodySet;
+use crate::dynamics::{IslandSet, RigidBodySet};
use crate::geometry::{ColliderHandle, ColliderSet, RemovedCollider};
use crate::math::{Point, Real, Vector, DIM};
use bit_vec::BitVec;
@@ -621,6 +621,7 @@ impl BroadPhase {
pub(crate) fn update_aabbs(
&mut self,
prediction_distance: Real,
+ islands: &IslandSet,
bodies: &RigidBodySet,
colliders: &mut ColliderSet,
) {
@@ -633,10 +634,11 @@ impl BroadPhase {
for body_handle in bodies
.modified_inactive_set
.iter()
- .chain(bodies.active_dynamic_set.iter())
- .chain(bodies.active_kinematic_set.iter())
+ .copied()
+ .chain(islands.active_bodies())
+ .chain(bodies.active_kinematic_set.iter().copied())
{
- for handle in &bodies[*body_handle].colliders {
+ for handle in &bodies[body_handle].colliders {
let collider = &mut colliders[*handle];
let aabb = collider.compute_aabb().loosened(prediction_distance / 2.0);
diff --git a/src/geometry/narrow_phase.rs b/src/geometry/narrow_phase.rs
index c462689..9c6b892 100644
--- a/src/geometry/narrow_phase.rs
+++ b/src/geometry/narrow_phase.rs
@@ -3,7 +3,7 @@ use rayon::prelude::*;
use crate::data::pubsub::Subscription;
use crate::data::Coarena;
-use crate::dynamics::{BodyPair, CoefficientCombineRule, RigidBodySet};
+use crate::dynamics::{BodyPair, CoefficientCombineRule, IslandSet, RigidBodySet};
use crate::geometry::{
BroadPhasePairEvent, ColliderGraphIndex, ColliderHandle, ContactData, ContactEvent,
ContactManifoldData, ContactPairFilter, IntersectionEvent, IntersectionPairFilter,
@@ -241,6 +241,7 @@ impl NarrowPhase {
pub(crate) fn register_pairs(
&mut self,
+ islands: &mut IslandSet,
colliders: &mut ColliderSet,
bodies: &mut RigidBodySet,
broad_phase_events: &[BroadPhasePairEvent],
@@ -327,6 +328,8 @@ impl NarrowPhase {
gid2.contact_graph_index,
interaction,
);
+
+ islands.contact_started(bodies, co1.parent, co2.parent);
}
}
}
@@ -385,6 +388,7 @@ impl NarrowPhase {
pub(crate) fn compute_intersections(
&mut self,
+ islands: &IslandSet,
bodies: &RigidBodySet,
colliders: &ColliderSet,
pair_filter: Option<&dyn IntersectionPairFilter>,
@@ -402,9 +406,8 @@ impl NarrowPhase {
let rb1 = &bodies[co1.parent];
let rb2 = &bodies[co2.parent];
- if (rb1.is_sleeping() && rb2.is_static())
- || (rb2.is_sleeping() && rb1.is_static())
- || (rb1.is_sleeping() && rb2.is_sleeping())
+ if (rb1.is_dynamic() && islands.is_island_sleeping(rb1.island_id))
+ || (rb2.is_dynamic() && islands.is_island_sleeping(rb2.island_id))
{
// No need to update this intersection because nothing moved.
return;
@@ -454,6 +457,7 @@ impl NarrowPhase {
pub(crate) fn compute_contacts(
&mut self,
prediction_distance: Real,
+ islands: &IslandSet,
bodies: &RigidBodySet,
colliders: &ColliderSet,
pair_filter: Option<&dyn ContactPairFilter>,
@@ -470,9 +474,8 @@ impl NarrowPhase {
let rb1 = &bodies[co1.parent];
let rb2 = &bodies[co2.parent];
- if (rb1.is_sleeping() && rb2.is_static())
- || (rb2.is_sleeping() && rb1.is_static())
- || (rb1.is_sleeping() && rb2.is_sleeping())
+ if (rb1.is_dynamic() && islands.is_island_sleeping(rb1.island_id))
+ || (rb2.is_dynamic() && islands.is_island_sleeping(rb2.island_id))
{
// No need to update this contact because nothing moved.
return;
@@ -599,11 +602,12 @@ impl NarrowPhase {
// NOTE: this is very similar to the code from JointSet::select_active_interactions.
pub(crate) fn sort_and_select_active_contacts<'a>(
&'a mut self,
+ islands: &IslandSet,
bodies: &RigidBodySet,
out_manifolds: &mut Vec<&'a mut ContactManifold>,
out: &mut Vec<Vec<ContactManifoldIndex>>,
) {
- for out_island in &mut out[..bodies.num_islands()] {
+ for out_island in &mut out[..islands.num_active_islands()] {
out_island.clear();
}
@@ -618,13 +622,13 @@ impl NarrowPhase {
.contains(SolverFlags::COMPUTE_IMPULSES)
&& manifold.data.num_active_contacts() != 0
&& (rb1.is_dynamic() || rb2.is_dynamic())
- && (!rb1.is_dynamic() || !rb1.is_sleeping())
- && (!rb2.is_dynamic() || !rb2.is_sleeping())
+ && (!rb1.is_dynamic() || !islands.is_island_sleeping(rb1.island_id))
+ && (!rb2.is_dynamic() || !islands.is_island_sleeping(rb2.island_id))
{
let island_index = if !rb1.is_dynamic() {
- rb2.active_island_id
+ islands.islands()[rb2.island_id].active_island_id()
} else {
- rb1.active_island_id
+ islands.islands()[rb1.island_id].active_island_id()
};
out[island_index].push(out_manifolds.len());