From 0207f8cf96a3b091ca851276f98f3b482e2a39f2 Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 11 Dec 2022 17:47:16 +0100 Subject: Properly take initial sleeping state set by the user when creating a rigid-body --- src/dynamics/island_manager.rs | 20 +++++++++++++------- src/dynamics/rigid_body.rs | 6 +++++- 2 files changed, 18 insertions(+), 8 deletions(-) (limited to 'src/dynamics') 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); + } } } } diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs index 26be983..bb1e9bf 100644 --- a/src/dynamics/rigid_body.rs +++ b/src/dynamics/rigid_body.rs @@ -135,7 +135,7 @@ impl RigidBody { } /// Sets the type of this rigid-body. - pub fn set_body_type(&mut self, status: RigidBodyType) { + pub fn set_body_type(&mut self, status: RigidBodyType, wake_up: bool) { if status != self.body_type { self.changes.insert(RigidBodyChanges::TYPE); self.body_type = status; @@ -143,6 +143,10 @@ impl RigidBody { if status == RigidBodyType::Fixed { self.vels = RigidBodyVelocity::zero(); } + + if self.is_dynamic() && wake_up { + self.wake_up(true); + } } } -- cgit