Skip to content

Commit 48de838

Browse files
authored
feat: persistent islands + manifold reduction (#895)
* feat: initial implementation of contact manifold reduction * feat: try bepu-like manifold reduction * feat: simplification of the constraints counting and indexing logic * feat: add concept of incremental islands with a single awake island More islands manager fixes * feat: start adding support for multiple awake islands * feat: add more timings * feat: implement incremental island split & merge * chore: refactor islands manager into multiple files * chore: refactor manifold reduction to its own file + add naive reduction method * feat: add islands manager validation checks * fix various bugs in the new islands system * chore: remove redundant active_set_offset field
1 parent 1341329 commit 48de838

40 files changed

+2087
-1102
lines changed

crates/rapier2d-f64/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ serde-serialize = [
4343
"dep:serde",
4444
"bit-vec/serde",
4545
"arrayvec/serde",
46+
"vec_map/serde"
4647
]
4748
enhanced-determinism = ["simba/libm_force", "parry2d-f64/enhanced-determinism"]
4849
debug-render = []

crates/rapier2d/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ serde-serialize = [
4444
"dep:serde",
4545
"bit-vec/serde",
4646
"arrayvec/serde",
47+
"vec_map/serde"
4748
]
4849
enhanced-determinism = ["simba/libm_force", "parry2d/enhanced-determinism"]
4950
debug-render = []

crates/rapier3d-f64/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ serde-serialize = [
4646
"parry3d-f64/serde-serialize",
4747
"dep:serde",
4848
"bit-vec/serde",
49+
"vec_map/serde"
4950
]
5051
enhanced-determinism = ["simba/libm_force", "parry3d-f64/enhanced-determinism"]
5152
debug-render = []

crates/rapier3d/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ serde-serialize = [
4848
"parry3d/serde-serialize",
4949
"dep:serde",
5050
"bit-vec/serde",
51+
"vec_map/serde"
5152
]
5253
enhanced-determinism = ["simba/libm_force", "parry3d/enhanced-determinism"]
5354
debug-render = []

examples2d/one_way_platforms2.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ pub fn init_world(testbed: &mut Testbed) {
105105
}
106106

107107
for handle in physics.islands.active_bodies() {
108-
let body = &mut physics.bodies[*handle];
108+
let body = &mut physics.bodies[handle];
109109
if body.position().translation.y > 1.0 {
110110
body.set_gravity_scale(1.0, false);
111111
} else if body.position().translation.y < -1.0 {

examples3d/one_way_platforms3.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ pub fn init_world(testbed: &mut Testbed) {
105105
}
106106

107107
for handle in physics.islands.active_bodies() {
108-
let body = physics.bodies.get_mut(*handle).unwrap();
108+
let body = physics.bodies.get_mut(handle).unwrap();
109109
if body.position().translation.y > 1.0 {
110110
body.set_gravity_scale(1.0, false);
111111
} else if body.position().translation.y < -1.0 {

src/counters/collision_detection_counters.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ pub struct CollisionDetectionCounters {
88
pub ncontact_pairs: usize,
99
/// Time spent for the broad-phase of the collision detection.
1010
pub broad_phase_time: Timer,
11+
/// Time spent by the final broad-phase AABB update after body movement to keep
12+
/// user scene queries valid.
13+
pub final_broad_phase_time: Timer,
1114
/// Time spent for the narrow-phase of the collision detection.
1215
pub narrow_phase_time: Timer,
1316
}
@@ -18,6 +21,7 @@ impl CollisionDetectionCounters {
1821
CollisionDetectionCounters {
1922
ncontact_pairs: 0,
2023
broad_phase_time: Timer::new(),
24+
final_broad_phase_time: Timer::new(),
2125
narrow_phase_time: Timer::new(),
2226
}
2327
}
@@ -26,6 +30,7 @@ impl CollisionDetectionCounters {
2630
pub fn reset(&mut self) {
2731
self.ncontact_pairs = 0;
2832
self.broad_phase_time.reset();
33+
self.final_broad_phase_time.reset();
2934
self.narrow_phase_time.reset();
3035
}
3136
}
@@ -34,6 +39,7 @@ impl Display for CollisionDetectionCounters {
3439
fn fmt(&self, f: &mut Formatter) -> Result {
3540
writeln!(f, "Number of contact pairs: {}", self.ncontact_pairs)?;
3641
writeln!(f, "Broad-phase time: {}", self.broad_phase_time)?;
42+
writeln!(f, "Final broad-phase time: {}", self.final_broad_phase_time)?;
3743
writeln!(f, "Narrow-phase time: {}", self.narrow_phase_time)
3844
}
3945
}

src/counters/solver_counters.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ pub struct SolverCounters {
1212
pub velocity_resolution_time: Timer,
1313
/// Time spent for the assembly of all the velocity constraints.
1414
pub velocity_assembly_time: Timer,
15+
/// Time spent by the velocity assembly for initializing solver bodies.
16+
pub velocity_assembly_time_solver_bodies: Timer,
17+
/// Time spent by the velocity assemble for initializing the constraints.
18+
pub velocity_assembly_time_constraints_init: Timer,
1519
/// Time spent for the update of the velocity of the bodies.
1620
pub velocity_update_time: Timer,
1721
/// Time spent to write force back to user-accessible data.
@@ -25,6 +29,8 @@ impl SolverCounters {
2529
nconstraints: 0,
2630
ncontacts: 0,
2731
velocity_assembly_time: Timer::new(),
32+
velocity_assembly_time_solver_bodies: Timer::new(),
33+
velocity_assembly_time_constraints_init: Timer::new(),
2834
velocity_resolution_time: Timer::new(),
2935
velocity_update_time: Timer::new(),
3036
velocity_writeback_time: Timer::new(),
@@ -37,6 +43,8 @@ impl SolverCounters {
3743
self.ncontacts = 0;
3844
self.velocity_resolution_time.reset();
3945
self.velocity_assembly_time.reset();
46+
self.velocity_assembly_time_solver_bodies.reset();
47+
self.velocity_assembly_time_constraints_init.reset();
4048
self.velocity_update_time.reset();
4149
self.velocity_writeback_time.reset();
4250
}

src/counters/stages_counters.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ pub struct StagesCounters {
1010
pub collision_detection_time: Timer,
1111
/// Time spent for the computation of collision island and body activation/deactivation (sleeping).
1212
pub island_construction_time: Timer,
13+
/// Time spent for collecting awake constraints from islands.
14+
pub island_constraints_collection_time: Timer,
1315
/// Total time spent for the constraints resolution and position update.t
1416
pub solver_time: Timer,
1517
/// Total time spent for CCD and CCD resolution.
@@ -25,6 +27,7 @@ impl StagesCounters {
2527
update_time: Timer::new(),
2628
collision_detection_time: Timer::new(),
2729
island_construction_time: Timer::new(),
30+
island_constraints_collection_time: Timer::new(),
2831
solver_time: Timer::new(),
2932
ccd_time: Timer::new(),
3033
user_changes: Timer::new(),
@@ -36,6 +39,7 @@ impl StagesCounters {
3639
self.update_time.reset();
3740
self.collision_detection_time.reset();
3841
self.island_construction_time.reset();
42+
self.island_constraints_collection_time.reset();
3943
self.solver_time.reset();
4044
self.ccd_time.reset();
4145
self.user_changes.reset();
@@ -55,6 +59,11 @@ impl Display for StagesCounters {
5559
"Island construction time: {}",
5660
self.island_construction_time
5761
)?;
62+
writeln!(
63+
f,
64+
"Island construction time: {}",
65+
self.island_constraints_collection_time
66+
)?;
5867
writeln!(f, "Solver time: {}", self.solver_time)?;
5968
writeln!(f, "CCD time: {}", self.ccd_time)?;
6069
writeln!(f, "User changes time: {}", self.user_changes)

src/dynamics/ccd/ccd_solver.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ impl CCDSolver {
8888

8989
// println!("Checking CCD activation");
9090
for handle in islands.active_bodies() {
91-
let rb = bodies.index_mut_internal(*handle);
91+
let rb = bodies.index_mut_internal(handle);
9292

9393
if rb.ccd.ccd_enabled {
9494
let forces = if include_forces {
@@ -143,7 +143,7 @@ impl CCDSolver {
143143
let mut min_toi = dt;
144144

145145
for handle in islands.active_bodies() {
146-
let rb1 = &bodies[*handle];
146+
let rb1 = &bodies[handle];
147147

148148
if rb1.ccd.ccd_active {
149149
let predicted_body_pos1 = rb1.pos.integrate_forces_and_velocities(
@@ -276,7 +276,7 @@ impl CCDSolver {
276276
*/
277277
// TODO: don't iterate through all the colliders.
278278
for handle in islands.active_bodies() {
279-
let rb1 = &bodies[*handle];
279+
let rb1 = &bodies[handle];
280280

281281
if rb1.ccd.ccd_active {
282282
let predicted_body_pos1 = rb1.pos.integrate_forces_and_velocities(

0 commit comments

Comments
 (0)