aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/velocity_solver.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2022-02-27 22:04:51 +0100
committerSébastien Crozet <sebastien@crozet.re>2022-03-20 21:49:16 +0100
commit2e6f133b95b614f13445722e54f28105d9664841 (patch)
tree364ce4cb1b73614fca0bd8f443385c73e7a64026 /src/dynamics/solver/velocity_solver.rs
parent28cc19d104d986db54d8725e68189070bef31a8a (diff)
downloadrapier-2e6f133b95b614f13445722e54f28105d9664841.tar.gz
rapier-2e6f133b95b614f13445722e54f28105d9664841.tar.bz2
rapier-2e6f133b95b614f13445722e54f28105d9664841.zip
Second round to fix the parallel solver.
Diffstat (limited to 'src/dynamics/solver/velocity_solver.rs')
-rw-r--r--src/dynamics/solver/velocity_solver.rs61
1 files changed, 19 insertions, 42 deletions
diff --git a/src/dynamics/solver/velocity_solver.rs b/src/dynamics/solver/velocity_solver.rs
index 18bd7c9..66d7caf 100644
--- a/src/dynamics/solver/velocity_solver.rs
+++ b/src/dynamics/solver/velocity_solver.rs
@@ -1,6 +1,5 @@
use super::AnyJointVelocityConstraint;
use crate::data::{BundleSet, ComponentSet, ComponentSetMut};
-use crate::dynamics::solver::AnyGenericVelocityConstraint;
use crate::dynamics::{
solver::{AnyVelocityConstraint, DeltaVel},
IntegrationParameters, IslandManager, JointGraphEdge, MultibodyJointSet, RigidBodyDamping,
@@ -35,7 +34,6 @@ impl VelocitySolver {
manifolds_all: &mut [&mut ContactManifold],
joints_all: &mut [JointGraphEdge],
contact_constraints: &mut [AnyVelocityConstraint],
- generic_contact_constraints: &mut [AnyGenericVelocityConstraint],
generic_contact_jacobians: &DVector<Real>,
joint_constraints: &mut [AnyJointVelocityConstraint],
generic_joint_jacobians: &DVector<Real>,
@@ -58,22 +56,28 @@ impl VelocitySolver {
// Initialize delta-velocities (`mj_lambdas`) with external forces (gravity etc):
for handle in islands.active_island(island_id) {
- let (ids, mprops, forces): (&RigidBodyIds, &RigidBodyMassProps, &RigidBodyForces) =
- bodies.index_bundle(handle.0);
+ if let Some(link) = multibodies.rigid_body_link(*handle).copied() {
+ let multibody = multibodies
+ .get_multibody_mut_internal(link.multibody)
+ .unwrap();
- let dvel = &mut self.mj_lambdas[ids.active_set_offset];
+ if link.id == 0 || link.id == 1 && !multibody.root_is_dynamic {
+ let mut mj_lambdas = self
+ .generic_mj_lambdas
+ .rows_mut(multibody.solver_id, multibody.ndofs());
+ mj_lambdas.axpy(params.dt, &multibody.accelerations, 0.0);
+ }
+ } else {
+ let (ids, mprops, forces): (&RigidBodyIds, &RigidBodyMassProps, &RigidBodyForces) =
+ bodies.index_bundle(handle.0);
- // NOTE: `dvel.angular` is actually storing angular velocity delta multiplied
- // by the square root of the inertia tensor:
- dvel.angular += mprops.effective_world_inv_inertia_sqrt * forces.torque * params.dt;
- dvel.linear += forces.force.component_mul(&mprops.effective_inv_mass) * params.dt;
- }
+ let dvel = &mut self.mj_lambdas[ids.active_set_offset];
- for (_, multibody) in multibodies.multibodies.iter_mut() {
- let mut mj_lambdas = self
- .generic_mj_lambdas
- .rows_mut(multibody.solver_id, multibody.ndofs());
- mj_lambdas.axpy(params.dt, &multibody.accelerations, 0.0);
+ // NOTE: `dvel.angular` is actually storing angular velocity delta multiplied
+ // by the square root of the inertia tensor:
+ dvel.angular += mprops.effective_world_inv_inertia_sqrt * forces.torque * params.dt;
+ dvel.linear += forces.force.component_mul(&mprops.effective_inv_mass) * params.dt;
+ }
}
/*
@@ -92,10 +96,6 @@ impl VelocitySolver {
}
for constraint in &mut *contact_constraints {
- constraint.solve(cfm_factor, &mut self.mj_lambdas[..], true, false);
- }
-
- for constraint in &mut *generic_contact_constraints {
constraint.solve(
cfm_factor,
generic_contact_jacobians,
@@ -108,10 +108,6 @@ impl VelocitySolver {
if solve_friction {
for constraint in &mut *contact_constraints {
- constraint.solve(cfm_factor, &mut self.mj_lambdas[..], false, true);
- }
-
- for constraint in &mut *generic_contact_constraints {
constraint.solve(
cfm_factor,
generic_contact_jacobians,
@@ -135,10 +131,6 @@ impl VelocitySolver {
for _ in 0..remaining_friction_iterations {
for constraint in &mut *contact_constraints {
- constraint.solve(cfm_factor, &mut self.mj_lambdas[..], false, true);
- }
-
- for constraint in &mut *generic_contact_constraints {
constraint.solve(
cfm_factor,
generic_contact_jacobians,
@@ -204,9 +196,6 @@ impl VelocitySolver {
for constraint in &mut *contact_constraints {
constraint.remove_bias_from_rhs();
}
- for constraint in &mut *generic_contact_constraints {
- constraint.remove_bias_from_rhs();
- }
for _ in 0..params.max_stabilization_iterations {
for constraint in &mut *joint_constraints {
@@ -218,10 +207,6 @@ impl VelocitySolver {
}
for constraint in &mut *contact_constraints {
- constraint.solve(1.0, &mut self.mj_lambdas[..], true, false);
- }
-
- for constraint in &mut *generic_contact_constraints {
constraint.solve(
1.0,
generic_contact_jacobians,
@@ -233,10 +218,6 @@ impl VelocitySolver {
}
for constraint in &mut *contact_constraints {
- constraint.solve(1.0, &mut self.mj_lambdas[..], false, true);
- }
-
- for constraint in &mut *generic_contact_constraints {
constraint.solve(
1.0,
generic_contact_jacobians,
@@ -290,9 +271,5 @@ impl VelocitySolver {
for constraint in &*contact_constraints {
constraint.writeback_impulses(manifolds_all);
}
-
- for constraint in &*generic_contact_constraints {
- constraint.writeback_impulses(manifolds_all);
- }
}
}