aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/joint_constraint/generic_position_constraint_wide.rs
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2021-02-10 11:56:51 +0100
committerCrozet Sébastien <developer@crozet.re>2021-02-11 15:58:46 +0100
commit5b80c4efbf93ad1294c9d3d390d8c8f090681b0e (patch)
treed82cef06b68a078dc23230e4e596021f7071b9b7 /src/dynamics/solver/joint_constraint/generic_position_constraint_wide.rs
parent3be866920657f7a13a49486795e06f14d92f4969 (diff)
downloadrapier-5b80c4efbf93ad1294c9d3d390d8c8f090681b0e.tar.gz
rapier-5b80c4efbf93ad1294c9d3d390d8c8f090681b0e.tar.bz2
rapier-5b80c4efbf93ad1294c9d3d390d8c8f090681b0e.zip
Start experimenting with a generic joint implementation for joint drives.
Diffstat (limited to 'src/dynamics/solver/joint_constraint/generic_position_constraint_wide.rs')
-rw-r--r--src/dynamics/solver/joint_constraint/generic_position_constraint_wide.rs51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/dynamics/solver/joint_constraint/generic_position_constraint_wide.rs b/src/dynamics/solver/joint_constraint/generic_position_constraint_wide.rs
new file mode 100644
index 0000000..9ceea67
--- /dev/null
+++ b/src/dynamics/solver/joint_constraint/generic_position_constraint_wide.rs
@@ -0,0 +1,51 @@
+use super::{GenericPositionConstraint, GenericPositionGroundConstraint};
+use crate::dynamics::{GenericJoint, IntegrationParameters, RigidBody};
+use crate::math::{Isometry, Real, SIMD_WIDTH};
+
+// TODO: this does not uses SIMD optimizations yet.
+#[derive(Debug)]
+pub(crate) struct WGenericPositionConstraint {
+ constraints: [GenericPositionConstraint; SIMD_WIDTH],
+}
+
+impl WGenericPositionConstraint {
+ pub fn from_params(
+ rbs1: [&RigidBody; SIMD_WIDTH],
+ rbs2: [&RigidBody; SIMD_WIDTH],
+ cparams: [&GenericJoint; SIMD_WIDTH],
+ ) -> Self {
+ Self {
+ constraints: array![|ii| GenericPositionConstraint::from_params(rbs1[ii], rbs2[ii], cparams[ii]); SIMD_WIDTH],
+ }
+ }
+
+ pub fn solve(&self, params: &IntegrationParameters, positions: &mut [Isometry<Real>]) {
+ for constraint in &self.constraints {
+ constraint.solve(params, positions);
+ }
+ }
+}
+
+#[derive(Debug)]
+pub(crate) struct WGenericPositionGroundConstraint {
+ constraints: [GenericPositionGroundConstraint; SIMD_WIDTH],
+}
+
+impl WGenericPositionGroundConstraint {
+ pub fn from_params(
+ rbs1: [&RigidBody; SIMD_WIDTH],
+ rbs2: [&RigidBody; SIMD_WIDTH],
+ cparams: [&GenericJoint; SIMD_WIDTH],
+ flipped: [bool; SIMD_WIDTH],
+ ) -> Self {
+ Self {
+ constraints: array![|ii| GenericPositionGroundConstraint::from_params(rbs1[ii], rbs2[ii], cparams[ii], flipped[ii]); SIMD_WIDTH],
+ }
+ }
+
+ pub fn solve(&self, params: &IntegrationParameters, positions: &mut [Isometry<Real>]) {
+ for constraint in &self.constraints {
+ constraint.solve(params, positions);
+ }
+ }
+}