diff options
| author | Sébastien Crozet <developer@crozet.re> | 2022-04-16 11:54:03 +0200 |
|---|---|---|
| committer | Sébastien Crozet <sebastien@crozet.re> | 2022-04-20 17:11:06 +0200 |
| commit | ee679427cda6363e4de94a59e293d01133a44d1f (patch) | |
| tree | c7b9ddd17c4d8580020d1037ccc375211bc1ee3d /src/dynamics/solver/interaction_groups.rs | |
| parent | 775c45e9ff13de088566c51697c667626cecf91e (diff) | |
| download | rapier-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.rs | 8 |
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; |
