aboutsummaryrefslogtreecommitdiff
path: root/src/utils.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.rs')
-rw-r--r--src/utils.rs30
1 files changed, 15 insertions, 15 deletions
diff --git a/src/utils.rs b/src/utils.rs
index 91ce41c..ecdd4fd 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -5,13 +5,15 @@ use crate::dynamics::RigidBodyHandle;
use indexmap::IndexMap as HashMap;
use na::{Matrix2, Matrix3, Matrix3x2, Point2, Point3, Scalar, SimdRealField, Vector2, Vector3};
use num::Zero;
-#[cfg(feature = "simd-is-enabled")]
use simba::simd::SimdValue;
#[cfg(all(not(feature = "enhanced-determinism"), feature = "serde-serialize"))]
use std::collections::HashMap;
use std::ops::{Add, Mul};
-#[cfg(feature = "simd-is-enabled")]
-use {crate::simd::SimdFloat, na::SimdPartialOrd, num::One};
+use {
+ crate::simd::{SimdBool, SimdFloat},
+ na::SimdPartialOrd,
+ num::One,
+};
// pub(crate) const SIN_10_DEGREES: f32 = 0.17364817766;
// pub(crate) const COS_10_DEGREES: f32 = 0.98480775301;
@@ -31,6 +33,16 @@ pub(crate) fn inv(val: f32) -> f32 {
}
}
+/// Conditionally swaps each lanes of `a` with those of `b`.
+///
+/// For each `i in [0..SIMD_WIDTH[`, if `do_swap.extract(i)` is `true` then
+/// `a.extract(i)` is swapped with `b.extract(i)`.
+pub fn simd_swap(do_swap: SimdBool, a: &mut SimdFloat, b: &mut SimdFloat) {
+ let _a = *a;
+ *a = b.select(do_swap, *a);
+ *b = _a.select(do_swap, *b);
+}
+
/// Trait to copy the sign of each component of one scalar/vector/matrix to another.
pub trait WSign<Rhs>: Sized {
// See SIMD implementations of copy_sign there: https://stackoverflow.com/a/57872652
@@ -77,7 +89,6 @@ impl<N: Scalar + Copy + WSign<N>> WSign<Vector3<N>> for Vector3<N> {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WSign<SimdFloat> for SimdFloat {
fn copy_sign_to(self, to: SimdFloat) -> SimdFloat {
self.simd_copysign(to)
@@ -102,7 +113,6 @@ impl WComponent for f32 {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WComponent for SimdFloat {
type Element = f32;
@@ -319,7 +329,6 @@ impl WDot<f32> for f32 {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WCrossMatrix for Vector3<SimdFloat> {
type CrossMat = Matrix3<SimdFloat>;
@@ -334,7 +343,6 @@ impl WCrossMatrix for Vector3<SimdFloat> {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WCrossMatrix for Vector2<SimdFloat> {
type CrossMat = Vector2<SimdFloat>;
@@ -344,7 +352,6 @@ impl WCrossMatrix for Vector2<SimdFloat> {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WCross<Vector3<SimdFloat>> for Vector3<SimdFloat> {
type Result = Vector3<SimdFloat>;
@@ -353,7 +360,6 @@ impl WCross<Vector3<SimdFloat>> for Vector3<SimdFloat> {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WCross<Vector2<SimdFloat>> for SimdFloat {
type Result = Vector2<SimdFloat>;
@@ -362,7 +368,6 @@ impl WCross<Vector2<SimdFloat>> for SimdFloat {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WCross<Vector2<SimdFloat>> for Vector2<SimdFloat> {
type Result = SimdFloat;
@@ -373,7 +378,6 @@ impl WCross<Vector2<SimdFloat>> for Vector2<SimdFloat> {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WDot<Vector3<SimdFloat>> for Vector3<SimdFloat> {
type Result = SimdFloat;
@@ -382,7 +386,6 @@ impl WDot<Vector3<SimdFloat>> for Vector3<SimdFloat> {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WDot<Vector2<SimdFloat>> for Vector2<SimdFloat> {
type Result = SimdFloat;
@@ -391,7 +394,6 @@ impl WDot<Vector2<SimdFloat>> for Vector2<SimdFloat> {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WDot<SimdFloat> for SimdFloat {
type Result = SimdFloat;
@@ -445,7 +447,6 @@ impl WAngularInertia<f32> for f32 {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WAngularInertia<SimdFloat> for SimdFloat {
type AngVector = SimdFloat;
type LinVector = Vector2<SimdFloat>;
@@ -860,7 +861,6 @@ impl WAngularInertia<f32> for SdpMatrix3<f32> {
}
}
-#[cfg(feature = "simd-is-enabled")]
impl WAngularInertia<SimdFloat> for SdpMatrix3<SimdFloat> {
type AngVector = Vector3<SimdFloat>;
type LinVector = Vector3<SimdFloat>;