Skip to content

Commit e88b9ab

Browse files
committed
Improve determinism with inserting by Entity order
1 parent db9348c commit e88b9ab

File tree

1 file changed

+42
-6
lines changed

1 file changed

+42
-6
lines changed

src/plugin/systems.rs

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,12 @@ pub fn init_colliders(
735735
let context = &mut *context;
736736
let physics_scale = context.physics_scale;
737737

738+
let colliders = colliders.iter();
739+
#[cfg(feature = "enhanced-determinism")]
740+
let mut colliders: Vec<ColliderComponents> = colliders.collect();
741+
#[cfg(feature = "enhanced-determinism")]
742+
colliders.sort_unstable_by_key(|f| f.0);
743+
738744
for (
739745
entity,
740746
shape,
@@ -748,7 +754,7 @@ pub fn init_colliders(
748754
collision_groups,
749755
solver_groups,
750756
contact_force_event_threshold,
751-
) in colliders.iter()
757+
) in colliders
752758
{
753759
let mut scaled_shape = shape.clone();
754760
scaled_shape.set_scale(shape.scale / physics_scale, config.scaled_shape_subdivision);
@@ -852,6 +858,12 @@ pub fn init_rigid_bodies(
852858
) {
853859
let physics_scale = context.physics_scale;
854860

861+
let rigid_bodies = rigid_bodies.iter();
862+
#[cfg(feature = "enhanced-determinism")]
863+
let mut rigid_bodies: Vec<RigidBodyComponents> = rigid_bodies.collect();
864+
#[cfg(feature = "enhanced-determinism")]
865+
rigid_bodies.sort_unstable_by_key(|f| f.0);
866+
855867
for (
856868
entity,
857869
rb,
@@ -866,7 +878,7 @@ pub fn init_rigid_bodies(
866878
dominance,
867879
sleep,
868880
damping,
869-
) in rigid_bodies.iter()
881+
) in rigid_bodies
870882
{
871883
let mut builder = RigidBodyBuilder::new((*rb).into());
872884
if let Some(transform) = transform {
@@ -995,7 +1007,13 @@ pub fn init_joints(
9951007
let context = &mut *context;
9961008
let scale = context.physics_scale;
9971009

998-
for (entity, joint) in impulse_joints.iter() {
1010+
let impulse_joints = impulse_joints.iter();
1011+
#[cfg(feature = "enhanced-determinism")]
1012+
let mut impulse_joints: Vec<(Entity, &ImpulseJoint)> = impulse_joints.collect();
1013+
#[cfg(feature = "enhanced-determinism")]
1014+
impulse_joints.sort_unstable_by_key(|f| f.0);
1015+
1016+
for (entity, joint) in impulse_joints {
9991017
let mut target = None;
10001018
let mut body_entity = entity;
10011019
while target.is_none() {
@@ -1019,7 +1037,13 @@ pub fn init_joints(
10191037
}
10201038
}
10211039

1022-
for (entity, joint) in multibody_joints.iter() {
1040+
let multibody_joints = multibody_joints.iter();
1041+
#[cfg(feature = "enhanced-determinism")]
1042+
let mut multibody_joints: Vec<(Entity, &MultibodyJoint)> = multibody_joints.collect();
1043+
#[cfg(feature = "enhanced-determinism")]
1044+
multibody_joints.sort_unstable_by_key(|f| f.0);
1045+
1046+
for (entity, joint) in multibody_joints {
10231047
let target = context.entity2body.get(&entity);
10241048

10251049
if let (Some(target), Some(source)) = (target, context.entity2body.get(&joint.parent)) {
@@ -1097,7 +1121,13 @@ pub fn sync_removals(
10971121
/*
10981122
* Collider removal detection.
10991123
*/
1100-
for entity in removed_colliders.iter() {
1124+
let removed_colliders = removed_colliders.iter();
1125+
#[cfg(feature = "enhanced-determinism")]
1126+
let mut removed_colliders: Vec<Entity> = removed_colliders.collect();
1127+
#[cfg(feature = "enhanced-determinism")]
1128+
removed_colliders.sort_unstable();
1129+
1130+
for entity in removed_colliders {
11011131
if let Some(handle) = context.entity2collider.remove(&entity) {
11021132
context
11031133
.colliders
@@ -1106,7 +1136,13 @@ pub fn sync_removals(
11061136
}
11071137
}
11081138

1109-
for entity in orphan_colliders.iter() {
1139+
let orphan_colliders = orphan_colliders.iter();
1140+
#[cfg(feature = "enhanced-determinism")]
1141+
let mut orphan_colliders: Vec<Entity> = orphan_colliders.collect();
1142+
#[cfg(feature = "enhanced-determinism")]
1143+
orphan_colliders.sort_unstable();
1144+
1145+
for entity in orphan_colliders {
11101146
if let Some(handle) = context.entity2collider.remove(&entity) {
11111147
context
11121148
.colliders

0 commit comments

Comments
 (0)