aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2021-06-02 17:26:47 +0200
committerGitHub <noreply@github.com>2021-06-02 17:26:47 +0200
commit8a3103a35b2ee5773dda6bb92870d9bfadc6ba70 (patch)
tree91f32796670d519cc1b60a1afdfc0c3701513b07 /src/dynamics
parentd3d998e91e39e64b9bdd9060ba7904218fd8cfbe (diff)
parent6356dca1d5a753768bbb479aa9491805223e1c60 (diff)
downloadrapier-8a3103a35b2ee5773dda6bb92870d9bfadc6ba70.tar.gz
rapier-8a3103a35b2ee5773dda6bb92870d9bfadc6ba70.tar.bz2
rapier-8a3103a35b2ee5773dda6bb92870d9bfadc6ba70.zip
Merge pull request #195 from tpdickso/ungenerate-nans
Add feature flag to disable floating point exceptions in unexceptional code
Diffstat (limited to 'src/dynamics')
-rw-r--r--src/dynamics/solver/velocity_constraint.rs8
-rw-r--r--src/dynamics/solver/velocity_constraint_element.rs8
-rw-r--r--src/dynamics/solver/velocity_ground_constraint_element.rs7
3 files changed, 20 insertions, 3 deletions
diff --git a/src/dynamics/solver/velocity_constraint.rs b/src/dynamics/solver/velocity_constraint.rs
index e15f2d8..90c574c 100644
--- a/src/dynamics/solver/velocity_constraint.rs
+++ b/src/dynamics/solver/velocity_constraint.rs
@@ -385,7 +385,13 @@ where
let relative_linvel = linvel1 - linvel2;
let mut tangent_relative_linvel =
relative_linvel - force_dir1 * (force_dir1.dot(&relative_linvel));
- let tangent_linvel_norm = tangent_relative_linvel.normalize_mut();
+
+ let tangent_linvel_norm = {
+ let _disable_fe_except =
+ crate::utils::DisableFloatingPointExceptionsFlags::disable_floating_point_exceptions();
+ tangent_relative_linvel.normalize_mut()
+ };
+
let threshold: N::Element = na::convert(1.0e-4);
let use_fallback = tangent_linvel_norm.simd_lt(N::splat(threshold));
let tangent_fallback = force_dir1.orthonormal_vector();
diff --git a/src/dynamics/solver/velocity_constraint_element.rs b/src/dynamics/solver/velocity_constraint_element.rs
index 1324c35..d1ad6ac 100644
--- a/src/dynamics/solver/velocity_constraint_element.rs
+++ b/src/dynamics/solver/velocity_constraint_element.rs
@@ -99,7 +99,13 @@ impl<N: SimdRealField> VelocityConstraintTangentPart<N> {
self.impulse[0] - self.r[0] * dimpulse_0,
self.impulse[1] - self.r[1] * dimpulse_1,
);
- let new_impulse = new_impulse.simd_cap_magnitude(limit);
+ let new_impulse = {
+ let _disable_fe_except =
+ crate::utils::DisableFloatingPointExceptionsFlags::
+ disable_floating_point_exceptions();
+ new_impulse.simd_cap_magnitude(limit)
+ };
+
let dlambda = new_impulse - self.impulse;
self.impulse = new_impulse;
diff --git a/src/dynamics/solver/velocity_ground_constraint_element.rs b/src/dynamics/solver/velocity_ground_constraint_element.rs
index 8bcdc82..c4c6393 100644
--- a/src/dynamics/solver/velocity_ground_constraint_element.rs
+++ b/src/dynamics/solver/velocity_ground_constraint_element.rs
@@ -78,7 +78,12 @@ impl<N: SimdRealField> VelocityGroundConstraintTangentPart<N> {
self.impulse[0] - self.r[0] * dimpulse_0,
self.impulse[1] - self.r[1] * dimpulse_1,
);
- let new_impulse = new_impulse.simd_cap_magnitude(limit);
+ let new_impulse = {
+ let _disable_fe_except =
+ crate::utils::DisableFloatingPointExceptionsFlags::
+ disable_floating_point_exceptions();
+ new_impulse.simd_cap_magnitude(limit)
+ };
let dlambda = new_impulse - self.impulse;
self.impulse = new_impulse;