aboutsummaryrefslogtreecommitdiff
path: root/src/pipeline/user_changes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/pipeline/user_changes.rs')
-rw-r--r--src/pipeline/user_changes.rs36
1 files changed, 19 insertions, 17 deletions
diff --git a/src/pipeline/user_changes.rs b/src/pipeline/user_changes.rs
index 9872208..e7da68a 100644
--- a/src/pipeline/user_changes.rs
+++ b/src/pipeline/user_changes.rs
@@ -2,17 +2,12 @@ use crate::dynamics::{
IslandManager, RigidBodyChanges, RigidBodyHandle, RigidBodySet, RigidBodyType,
};
use crate::geometry::{ColliderChanges, ColliderHandle, ColliderPosition, ColliderSet};
-use parry::utils::hashmap::HashMap;
pub(crate) fn handle_user_changes_to_colliders(
bodies: &mut RigidBodySet,
colliders: &mut ColliderSet,
modified_colliders: &[ColliderHandle],
) {
- // TODO: avoid this hashmap? We could perhaps add a new flag to RigidBodyChanges to
- // indicated that the mass properties need to be recomputed?
- let mut mprops_to_update = HashMap::default();
-
for handle in modified_colliders {
// NOTE: we use `get` because the collider may no longer
// exist if it has been removed.
@@ -26,22 +21,19 @@ pub(crate) fn handle_user_changes_to_colliders(
}
}
- if co.changes.contains(ColliderChanges::SHAPE) {
- if let Some(co_parent) = co.parent {
- mprops_to_update.insert(co_parent.handle, ());
+ if co
+ .changes
+ .intersects(ColliderChanges::SHAPE | ColliderChanges::LOCAL_MASS_PROPERTIES)
+ {
+ if let Some(rb) = co
+ .parent
+ .and_then(|p| bodies.get_mut_internal_with_modification_tracking(p.handle))
+ {
+ rb.changes |= RigidBodyChanges::LOCAL_MASS_PROPERTIES;
}
}
}
}
-
- for (to_update, _) in mprops_to_update {
- let rb = bodies.index_mut_internal(to_update);
- rb.mprops.recompute_mass_properties_from_colliders(
- colliders,
- &rb.colliders,
- &rb.pos.position,
- );
- }
}
pub(crate) fn handle_user_changes_to_rigid_bodies(
@@ -163,6 +155,16 @@ pub(crate) fn handle_user_changes_to_rigid_bodies(
}
}
+ if changes
+ .intersects(RigidBodyChanges::LOCAL_MASS_PROPERTIES | RigidBodyChanges::COLLIDERS)
+ {
+ rb.mprops.recompute_mass_properties_from_colliders(
+ colliders,
+ &rb.colliders,
+ &rb.pos.position,
+ );
+ }
+
rb.changes = RigidBodyChanges::empty();
rb.ids = ids;
rb.activation = activation;