aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/island_solver.rs
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2021-01-29 14:42:32 +0100
committerGitHub <noreply@github.com>2021-01-29 14:42:32 +0100
commit7ca46f38cde6cf8bf8bf41ea6067ae5bc938205c (patch)
tree3781b9d7c92a6a8111573ba4cae1c5d41435950e /src/dynamics/solver/island_solver.rs
parente6fc8f67faf3e37afe38d683cbd930d457f289be (diff)
parent825f33efaec4ce6a8903751e836a0ea9c466ff92 (diff)
downloadrapier-7ca46f38cde6cf8bf8bf41ea6067ae5bc938205c.tar.gz
rapier-7ca46f38cde6cf8bf8bf41ea6067ae5bc938205c.tar.bz2
rapier-7ca46f38cde6cf8bf8bf41ea6067ae5bc938205c.zip
Merge pull request #79 from dimforge/split_geom
Move most of the geometric code to another crate.
Diffstat (limited to 'src/dynamics/solver/island_solver.rs')
-rw-r--r--src/dynamics/solver/island_solver.rs43
1 files changed, 23 insertions, 20 deletions
diff --git a/src/dynamics/solver/island_solver.rs b/src/dynamics/solver/island_solver.rs
index b548c6b..deed8c2 100644
--- a/src/dynamics/solver/island_solver.rs
+++ b/src/dynamics/solver/island_solver.rs
@@ -1,9 +1,15 @@
use super::{PositionSolver, VelocitySolver};
use crate::counters::Counters;
+use crate::dynamics::solver::{
+ AnyJointPositionConstraint, AnyJointVelocityConstraint, AnyPositionConstraint,
+ AnyVelocityConstraint, SolverConstraints,
+};
use crate::dynamics::{IntegrationParameters, JointGraphEdge, JointIndex, RigidBodySet};
use crate::geometry::{ContactManifold, ContactManifoldIndex};
pub struct IslandSolver {
+ contact_constraints: SolverConstraints<AnyVelocityConstraint, AnyPositionConstraint>,
+ joint_constraints: SolverConstraints<AnyJointVelocityConstraint, AnyJointPositionConstraint>,
velocity_solver: VelocitySolver,
position_solver: PositionSolver,
}
@@ -11,6 +17,8 @@ pub struct IslandSolver {
impl IslandSolver {
pub fn new() -> Self {
Self {
+ contact_constraints: SolverConstraints::new(),
+ joint_constraints: SolverConstraints::new(),
velocity_solver: VelocitySolver::new(),
position_solver: PositionSolver::new(),
}
@@ -29,33 +37,23 @@ impl IslandSolver {
) {
if manifold_indices.len() != 0 || joint_indices.len() != 0 {
counters.solver.velocity_assembly_time.resume();
- self.velocity_solver.init_constraints(
- island_id,
- params,
- bodies,
- manifolds,
- &manifold_indices,
- joints,
- &joint_indices,
- );
+ self.contact_constraints
+ .init(island_id, params, bodies, manifolds, manifold_indices);
+ self.joint_constraints
+ .init(island_id, params, bodies, joints, joint_indices);
counters.solver.velocity_assembly_time.pause();
counters.solver.velocity_resolution_time.resume();
- self.velocity_solver
- .solve_constraints(island_id, params, bodies, manifolds, joints);
- counters.solver.velocity_resolution_time.pause();
-
- counters.solver.position_assembly_time.resume();
- self.position_solver.init_constraints(
+ self.velocity_solver.solve(
island_id,
params,
bodies,
manifolds,
- &manifold_indices,
joints,
- &joint_indices,
+ &mut self.contact_constraints.velocity_constraints,
+ &mut self.joint_constraints.velocity_constraints,
);
- counters.solver.position_assembly_time.pause();
+ counters.solver.velocity_resolution_time.pause();
}
counters.solver.velocity_update_time.resume();
@@ -64,8 +62,13 @@ impl IslandSolver {
if manifold_indices.len() != 0 || joint_indices.len() != 0 {
counters.solver.position_resolution_time.resume();
- self.position_solver
- .solve_constraints(island_id, params, bodies);
+ self.position_solver.solve(
+ island_id,
+ params,
+ bodies,
+ &self.contact_constraints.position_constraints,
+ &self.joint_constraints.position_constraints,
+ );
counters.solver.position_resolution_time.pause();
}
}