aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/island_solver.rs
blob: 7ce142abe0abc29141c692e1a158cc5fea428f19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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();
        }
    }
}