aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/interaction_groups.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2022-04-16 11:54:03 +0200
committerSébastien Crozet <sebastien@crozet.re>2022-04-20 17:11:06 +0200
commitee679427cda6363e4de94a59e293d01133a44d1f (patch)
treec7b9ddd17c4d8580020d1037ccc375211bc1ee3d /src/dynamics/solver/interaction_groups.rs
parent775c45e9ff13de088566c51697c667626cecf91e (diff)
downloadrapier-ee679427cda6363e4de94a59e293d01133a44d1f.tar.gz
rapier-ee679427cda6363e4de94a59e293d01133a44d1f.tar.bz2
rapier-ee679427cda6363e4de94a59e293d01133a44d1f.zip
Fix mass-properties update after collider change
Diffstat (limited to 'src/dynamics/solver/interaction_groups.rs')
-rw-r--r--src/dynamics/solver/interaction_groups.rs8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/dynamics/solver/interaction_groups.rs b/src/dynamics/solver/interaction_groups.rs
index d806251..2bcbacc 100644
--- a/src/dynamics/solver/interaction_groups.rs
+++ b/src/dynamics/solver/interaction_groups.rs
@@ -431,14 +431,14 @@ impl InteractionGroups {
let data: (_, &RigidBodyIds) = bodies.index_bundle(rb1.0);
(*data.0, data.1.active_set_offset)
} else {
- (RigidBodyType::Fixed, 0)
+ (RigidBodyType::Fixed, usize::MAX)
};
let (status2, active_set_offset2) = if let Some(rb2) = interaction.data.rigid_body2
{
let data: (_, &RigidBodyIds) = bodies.index_bundle(rb2.0);
(*data.0, data.1.active_set_offset)
} else {
- (RigidBodyType::Fixed, 0)
+ (RigidBodyType::Fixed, usize::MAX)
};
let is_fixed1 = !status1.is_dynamic();
@@ -451,7 +451,9 @@ impl InteractionGroups {
let i1 = active_set_offset1;
let i2 = active_set_offset2;
- let conflicts = self.body_masks[i1] | self.body_masks[i2];
+ let mask1 = if !is_fixed1 { self.body_masks[i1] } else { 0 };
+ let mask2 = if !is_fixed2 { self.body_masks[i2] } else { 0 };
+ let conflicts = mask1 | mask2;
let conflictfree_targets = !(conflicts & occupied_mask); // The & is because we consider empty buckets as free of conflicts.
let conflictfree_occupied_targets = conflictfree_targets & occupied_mask;