aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/island_manager.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2022-12-11 17:47:16 +0100
committerSébastien Crozet <developer@crozet.re>2022-12-11 17:47:42 +0100
commit0207f8cf96a3b091ca851276f98f3b482e2a39f2 (patch)
treeee0e602dc19a39b02e3b70e093815ca7bbb9f917 /src/dynamics/island_manager.rs
parentcb9350fd802a6641597140c22e2a0ce4b2ebeb1f (diff)
downloadrapier-0207f8cf96a3b091ca851276f98f3b482e2a39f2.tar.gz
rapier-0207f8cf96a3b091ca851276f98f3b482e2a39f2.tar.bz2
rapier-0207f8cf96a3b091ca851276f98f3b482e2a39f2.zip
Properly take initial sleeping state set by the user when creating a rigid-body
Diffstat (limited to 'src/dynamics/island_manager.rs')
-rw-r--r--src/dynamics/island_manager.rs20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/dynamics/island_manager.rs b/src/dynamics/island_manager.rs
index edd2579..e196503 100644
--- a/src/dynamics/island_manager.rs
+++ b/src/dynamics/island_manager.rs
@@ -1,6 +1,6 @@
use crate::dynamics::{
- ImpulseJointSet, MultibodyJointSet, RigidBodyActivation, RigidBodyColliders, RigidBodyHandle,
- RigidBodyIds, RigidBodySet, RigidBodyType, RigidBodyVelocity,
+ ImpulseJointSet, MultibodyJointSet, RigidBodyActivation, RigidBodyChanges, RigidBodyColliders,
+ RigidBodyHandle, RigidBodyIds, RigidBodySet, RigidBodyType, RigidBodyVelocity,
};
use crate::geometry::{ColliderSet, NarrowPhase};
use crate::math::Real;
@@ -96,12 +96,18 @@ impl IslandManager {
// attempting to wake-up a rigid-body that has already been deleted.
if bodies.get(handle).map(|rb| rb.body_type()) == Some(RigidBodyType::Dynamic) {
let rb = bodies.index_mut_internal(handle);
- rb.activation.wake_up(strong);
- if rb.is_enabled() && self.active_dynamic_set.get(rb.ids.active_set_id) != Some(&handle)
- {
- rb.ids.active_set_id = self.active_dynamic_set.len();
- self.active_dynamic_set.push(handle);
+ // Check that the user didn’t change the sleeping state explicitly, in which
+ // case we don’t overwrite it.
+ if !rb.changes.contains(RigidBodyChanges::SLEEP) {
+ rb.activation.wake_up(strong);
+
+ if rb.is_enabled()
+ && self.active_dynamic_set.get(rb.ids.active_set_id) != Some(&handle)
+ {
+ rb.ids.active_set_id = self.active_dynamic_set.len();
+ self.active_dynamic_set.push(handle);
+ }
}
}
}