aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/rigid_body.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/dynamics/rigid_body.rs')
-rw-r--r--src/dynamics/rigid_body.rs41
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())