diff options
Diffstat (limited to 'src/dynamics/rigid_body.rs')
| -rw-r--r-- | src/dynamics/rigid_body.rs | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs index 064087c..9469dc7 100644 --- a/src/dynamics/rigid_body.rs +++ b/src/dynamics/rigid_body.rs @@ -7,7 +7,7 @@ use crate::geometry::{ ColliderHandle, ColliderMassProps, ColliderParent, ColliderPosition, ColliderSet, ColliderShape, }; use crate::math::{AngVector, Isometry, Point, Real, Rotation, Vector}; -use crate::utils::WCross; +use crate::utils::SimdCross; use num::Zero; #[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] @@ -36,6 +36,7 @@ pub struct RigidBody { /// The dominance group this rigid-body is part of. pub(crate) dominance: RigidBodyDominance, pub(crate) enabled: bool, + pub(crate) additional_solver_iterations: usize, /// User-defined data associated to this rigid-body. pub user_data: u128, } @@ -64,6 +65,7 @@ impl RigidBody { dominance: RigidBodyDominance::default(), enabled: true, user_data: 0, + additional_solver_iterations: 0, } } @@ -72,6 +74,27 @@ impl RigidBody { self.ids = Default::default(); } + /// Set the additional number of solver iterations run for this rigid-body and + /// everything interacting with it. + /// + /// See [`Self::set_additional_solver_iterations`] for additional information. + pub fn additional_solver_iterations(&self) -> usize { + self.additional_solver_iterations + } + + /// Set the additional number of solver iterations run for this rigid-body and + /// everything interacting with it. + /// + /// Increasing this number will help improve simulation accuracy on this rigid-body + /// and every rigid-body interacting directly or indirectly with it (through joints + /// or contacts). This implies a performance hit. + /// + /// The default value is 0, meaning [`IntegrationParameters::num_solver_iterations`] will + /// be used as number of solver iterations for this body. + pub fn set_additional_solver_iterations(&mut self, additional_iterations: usize) { + self.additional_solver_iterations = additional_iterations; + } + /// The activation status of this rigid-body. pub fn activation(&self) -> &RigidBodyActivation { &self.activation @@ -1030,6 +1053,11 @@ pub struct RigidBodyBuilder { pub enabled: bool, /// An arbitrary user-defined 128-bit integer associated to the rigid-bodies built by this builder. pub user_data: u128, + /// The additional number of solver iterations run for this rigid-body and + /// everything interacting with it. + /// + /// See [`RigidBody::set_additional_solver_iterations`] for additional information. + pub additional_solver_iterations: usize, } impl RigidBodyBuilder { @@ -1051,6 +1079,7 @@ impl RigidBodyBuilder { dominance_group: 0, enabled: true, user_data: 0, + additional_solver_iterations: 0, } } @@ -1090,6 +1119,15 @@ impl RigidBodyBuilder { Self::new(RigidBodyType::Dynamic) } + /// Sets the additional number of solver iterations run for this rigid-body and + /// everything interacting with it. + /// + /// See [`RigidBody::set_additional_solver_iterations`] for additional information. + pub fn additional_solver_iterations(mut self, additional_iterations: usize) -> Self { + self.additional_solver_iterations = additional_iterations; + self + } + /// Sets the scale applied to the gravity force affecting the rigid-body to be created. pub fn gravity_scale(mut self, scale_factor: Real) -> Self { self.gravity_scale = scale_factor; @@ -1311,6 +1349,7 @@ impl RigidBodyBuilder { rb.vels.angvel = self.angvel; rb.body_type = self.body_type; rb.user_data = self.user_data; + rb.additional_solver_iterations = self.additional_solver_iterations; if self.additional_mass_properties != RigidBodyAdditionalMassProps::MassProps(MassProperties::zero()) |
