diff options
| author | Sébastien Crozet <developer@crozet.re> | 2020-08-25 22:10:25 +0200 |
|---|---|---|
| committer | Sébastien Crozet <developer@crozet.re> | 2020-08-25 22:10:25 +0200 |
| commit | 754a48b7ff6d8c58b1ee08651e60112900b60455 (patch) | |
| tree | 7d777a6c003f1f5d8f8d24f533f35a95a88957fe /src/dynamics/solver/island_solver.rs | |
| download | rapier-754a48b7ff6d8c58b1ee08651e60112900b60455.tar.gz rapier-754a48b7ff6d8c58b1ee08651e60112900b60455.tar.bz2 rapier-754a48b7ff6d8c58b1ee08651e60112900b60455.zip | |
First public release of Rapier.v0.1.0
Diffstat (limited to 'src/dynamics/solver/island_solver.rs')
| -rw-r--r-- | src/dynamics/solver/island_solver.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/dynamics/solver/island_solver.rs b/src/dynamics/solver/island_solver.rs new file mode 100644 index 0000000..7ce142a --- /dev/null +++ b/src/dynamics/solver/island_solver.rs @@ -0,0 +1,73 @@ +use super::{PositionSolver, VelocitySolver}; +use crate::counters::Counters; +use crate::dynamics::{IntegrationParameters, JointGraphEdge, JointIndex, RigidBodySet}; +use crate::geometry::{ContactManifold, ContactManifoldIndex}; + +pub struct IslandSolver { + velocity_solver: VelocitySolver, + position_solver: PositionSolver, +} + +impl IslandSolver { + pub fn new() -> Self { + Self { + velocity_solver: VelocitySolver::new(), + position_solver: PositionSolver::new(), + } + } + + pub fn solve_island( + &mut self, + island_id: usize, + counters: &mut Counters, + params: &IntegrationParameters, + bodies: &mut RigidBodySet, + manifolds: &mut [&mut ContactManifold], + manifold_indices: &[ContactManifoldIndex], + joints: &mut [JointGraphEdge], + joint_indices: &[JointIndex], + ) { + 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, + ); + 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( + island_id, + params, + bodies, + manifolds, + &manifold_indices, + joints, + &joint_indices, + ); + counters.solver.position_assembly_time.pause(); + } + + counters.solver.velocity_update_time.resume(); + bodies + .foreach_active_island_body_mut_internal(island_id, |_, rb| rb.integrate(params.dt())); + counters.solver.velocity_update_time.pause(); + + if manifold_indices.len() != 0 || joint_indices.len() != 0 { + counters.solver.position_resolution_time.resume(); + self.position_solver + .solve_constraints(island_id, params, bodies); + counters.solver.position_resolution_time.pause(); + } + } +} |
