diff options
| -rw-r--r-- | src/dynamics/rigid_body.rs | 53 |
1 files changed, 41 insertions, 12 deletions
diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs index 4aaa474..a1a23a0 100644 --- a/src/dynamics/rigid_body.rs +++ b/src/dynamics/rigid_body.rs @@ -281,65 +281,94 @@ impl RigidBody { * Application of forces/impulses. */ /// Applies a force at the center-of-mass of this rigid-body. - pub fn apply_force(&mut self, force: Vector<f32>) { + pub fn apply_force(&mut self, force: Vector<f32>, wake_up: bool) { if self.body_status == BodyStatus::Dynamic { self.linacc += force * self.mass_properties.inv_mass; + + if wake_up { + self.wake_up(true); + } } } /// Applies an impulse at the center-of-mass of this rigid-body. - pub fn apply_impulse(&mut self, impulse: Vector<f32>) { + pub fn apply_impulse(&mut self, impulse: Vector<f32>, wake_up: bool) { if self.body_status == BodyStatus::Dynamic { self.linvel += impulse * self.mass_properties.inv_mass; + + if wake_up { + self.wake_up(true); + } } } /// Applies a torque at the center-of-mass of this rigid-body. #[cfg(feature = "dim2")] - pub fn apply_torque(&mut self, torque: f32) { + pub fn apply_torque(&mut self, torque: f32, wake_up: bool) { if self.body_status == BodyStatus::Dynamic { self.angacc += self.world_inv_inertia_sqrt * (self.world_inv_inertia_sqrt * torque); + + if wake_up { + self.wake_up(true); + } } } /// Applies a torque at the center-of-mass of this rigid-body. #[cfg(feature = "dim3")] - pub fn apply_torque(&mut self, torque: Vector<f32>) { + pub fn apply_torque(&mut self, torque: Vector<f32>, wake_up: bool) { if self.body_status == BodyStatus::Dynamic { self.angacc += self.world_inv_inertia_sqrt * (self.world_inv_inertia_sqrt * torque); + + if wake_up { + self.wake_up(true); + } } } /// Applies an impulsive torque at the center-of-mass of this rigid-body. #[cfg(feature = "dim2")] - pub fn apply_torque_impulse(&mut self, torque_impulse: f32) { + pub fn apply_torque_impulse(&mut self, torque_impulse: f32, wake_up: bool) { if self.body_status == BodyStatus::Dynamic { self.angvel += self.world_inv_inertia_sqrt * (self.world_inv_inertia_sqrt * torque_impulse); + + if wake_up { + self.wake_up(true); + } } } /// Applies an impulsive torque at the center-of-mass of this rigid-body. #[cfg(feature = "dim3")] - pub fn apply_torque_impulse(&mut self, torque_impulse: Vector<f32>) { + pub fn apply_torque_impulse(&mut self, torque_impulse: Vector<f32>, wake_up: bool) { if self.body_status == BodyStatus::Dynamic { self.angvel += self.world_inv_inertia_sqrt * (self.world_inv_inertia_sqrt * torque_impulse); + + if wake_up { + self.wake_up(true); + } } } /// Applies a force at the given world-space point of this rigid-body. - pub fn apply_force_at_point(&mut self, force: Vector<f32>, point: Point<f32>) { + pub fn apply_force_at_point(&mut self, force: Vector<f32>, point: Point<f32>, wake_up: bool) { let torque = (point - self.world_com).gcross(force); - self.apply_force(force); - self.apply_torque(torque); + self.apply_force(force, wake_up); + self.apply_torque(torque, wake_up); } /// Applies an impulse at the given world-space point of this rigid-body. - pub fn apply_impulse_at_point(&mut self, impulse: Vector<f32>, point: Point<f32>) { + pub fn apply_impulse_at_point( + &mut self, + impulse: Vector<f32>, + point: Point<f32>, + wake_up: bool, + ) { let torque_impulse = (point - self.world_com).gcross(impulse); - self.apply_impulse(impulse); - self.apply_torque_impulse(torque_impulse); + self.apply_impulse(impulse, wake_up); + self.apply_torque_impulse(torque_impulse, wake_up); } } |
