aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/position_constraint.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2021-05-01 10:17:23 +0200
committerGitHub <noreply@github.com>2021-05-01 10:17:23 +0200
commita385efc5582c7918f11c01a2b6bf26a46919d3a0 (patch)
treec5b9c5e6fcb5561421e2b4b9d99f28e4c83c745e /src/dynamics/solver/position_constraint.rs
parentaaf80bfa872c6f29b248cab8eb5658ab0d73cb4a (diff)
parent2dfbd9ae92c139e306afc87994adac82489f30eb (diff)
downloadrapier-a385efc5582c7918f11c01a2b6bf26a46919d3a0.tar.gz
rapier-a385efc5582c7918f11c01a2b6bf26a46919d3a0.tar.bz2
rapier-a385efc5582c7918f11c01a2b6bf26a46919d3a0.zip
Merge pull request #183 from dimforge/bundles
Make Rapier accept any kind of data storage instead of RigidBodySet/ColliderSet
Diffstat (limited to 'src/dynamics/solver/position_constraint.rs')
-rw-r--r--src/dynamics/solver/position_constraint.rs44
1 files changed, 29 insertions, 15 deletions
diff --git a/src/dynamics/solver/position_constraint.rs b/src/dynamics/solver/position_constraint.rs
index 844b1cd..dca0655 100644
--- a/src/dynamics/solver/position_constraint.rs
+++ b/src/dynamics/solver/position_constraint.rs
@@ -1,7 +1,8 @@
+use crate::data::ComponentSet;
use crate::dynamics::solver::PositionGroundConstraint;
#[cfg(feature = "simd-is-enabled")]
use crate::dynamics::solver::{WPositionConstraint, WPositionGroundConstraint};
-use crate::dynamics::{IntegrationParameters, RigidBodySet};
+use crate::dynamics::{IntegrationParameters, RigidBodyIds, RigidBodyMassProps, RigidBodyPosition};
use crate::geometry::ContactManifold;
use crate::math::{
AngularInertia, Isometry, Point, Real, Rotation, Translation, Vector, MAX_MANIFOLD_POINTS,
@@ -51,15 +52,26 @@ pub(crate) struct PositionConstraint {
}
impl PositionConstraint {
- pub fn generate(
+ pub fn generate<Bodies>(
params: &IntegrationParameters,
manifold: &ContactManifold,
- bodies: &RigidBodySet,
+ bodies: &Bodies,
out_constraints: &mut Vec<AnyPositionConstraint>,
push: bool,
- ) {
- let rb1 = &bodies[manifold.data.body_pair.body1];
- let rb2 = &bodies[manifold.data.body_pair.body2];
+ ) where
+ Bodies: ComponentSet<RigidBodyPosition>
+ + ComponentSet<RigidBodyMassProps>
+ + ComponentSet<RigidBodyIds>,
+ {
+ let handle1 = manifold.data.rigid_body1.unwrap();
+ let handle2 = manifold.data.rigid_body2.unwrap();
+
+ let ids1: &RigidBodyIds = bodies.index(handle1.0);
+ let ids2: &RigidBodyIds = bodies.index(handle2.0);
+ let poss1: &RigidBodyPosition = bodies.index(handle1.0);
+ let poss2: &RigidBodyPosition = bodies.index(handle2.0);
+ let mprops1: &RigidBodyMassProps = bodies.index(handle1.0);
+ let mprops2: &RigidBodyMassProps = bodies.index(handle2.0);
for (l, manifold_points) in manifold
.data
@@ -72,26 +84,28 @@ impl PositionConstraint {
let mut dists = [0.0; MAX_MANIFOLD_POINTS];
for l in 0..manifold_points.len() {
- local_p1[l] = rb1
+ local_p1[l] = poss1
.position
.inverse_transform_point(&manifold_points[l].point);
- local_p2[l] = rb2
+ local_p2[l] = poss2
.position
.inverse_transform_point(&manifold_points[l].point);
dists[l] = manifold_points[l].dist;
}
let constraint = PositionConstraint {
- rb1: rb1.active_set_offset,
- rb2: rb2.active_set_offset,
+ rb1: ids1.active_set_offset,
+ rb2: ids2.active_set_offset,
local_p1,
local_p2,
- local_n1: rb1.position.inverse_transform_vector(&manifold.data.normal),
+ local_n1: poss1
+ .position
+ .inverse_transform_vector(&manifold.data.normal),
dists,
- im1: rb1.effective_inv_mass,
- im2: rb2.effective_inv_mass,
- ii1: rb1.effective_world_inv_inertia_sqrt.squared(),
- ii2: rb2.effective_world_inv_inertia_sqrt.squared(),
+ im1: mprops1.effective_inv_mass,
+ im2: mprops2.effective_inv_mass,
+ ii1: mprops1.effective_world_inv_inertia_sqrt.squared(),
+ ii2: mprops2.effective_world_inv_inertia_sqrt.squared(),
num_contacts: manifold_points.len() as u8,
erp: params.erp,
max_linear_correction: params.max_linear_correction,