Skip to content

Commit 775e0a0

Browse files
committed
Improve determinism with inserting by Entity order
1 parent c9fe095 commit 775e0a0

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
@@ -734,6 +734,12 @@ pub fn init_colliders(
734734
let context = &mut *context;
735735
let physics_scale = context.physics_scale;
736736

737+
let colliders = colliders.iter();
738+
#[cfg(feature = "enhanced-determinism")]
739+
let mut colliders: Vec<ColliderComponents> = colliders.collect();
740+
#[cfg(feature = "enhanced-determinism")]
741+
colliders.sort_unstable_by_key(|f| f.0);
742+
737743
for (
738744
entity,
739745
shape,
@@ -747,7 +753,7 @@ pub fn init_colliders(
747753
collision_groups,
748754
solver_groups,
749755
contact_force_event_threshold,
750-
) in colliders.iter()
756+
) in colliders
751757
{
752758
let mut scaled_shape = shape.clone();
753759
scaled_shape.set_scale(shape.scale / physics_scale, config.scaled_shape_subdivision);
@@ -851,6 +857,12 @@ pub fn init_rigid_bodies(
851857
) {
852858
let physics_scale = context.physics_scale;
853859

860+
let rigid_bodies = rigid_bodies.iter();
861+
#[cfg(feature = "enhanced-determinism")]
862+
let mut rigid_bodies: Vec<RigidBodyComponents> = rigid_bodies.collect();
863+
#[cfg(feature = "enhanced-determinism")]
864+
rigid_bodies.sort_unstable_by_key(|f| f.0);
865+
854866
for (
855867
entity,
856868
rb,
@@ -865,7 +877,7 @@ pub fn init_rigid_bodies(
865877
dominance,
866878
sleep,
867879
damping,
868-
) in rigid_bodies.iter()
880+
) in rigid_bodies
869881
{
870882
let mut builder = RigidBodyBuilder::new((*rb).into());
871883
if let Some(transform) = transform {
@@ -994,7 +1006,13 @@ pub fn init_joints(
9941006
let context = &mut *context;
9951007
let scale = context.physics_scale;
9961008

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

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

10241048
if let (Some(target), Some(source)) = (target, context.entity2body.get(&joint.parent)) {
@@ -1096,7 +1120,13 @@ pub fn sync_removals(
10961120
/*
10971121
* Collider removal detection.
10981122
*/
1099-
for entity in removed_colliders.iter() {
1123+
let removed_colliders = removed_colliders.iter();
1124+
#[cfg(feature = "enhanced-determinism")]
1125+
let mut removed_colliders: Vec<Entity> = removed_colliders.collect();
1126+
#[cfg(feature = "enhanced-determinism")]
1127+
removed_colliders.sort_unstable();
1128+
1129+
for entity in removed_colliders {
11001130
if let Some(handle) = context.entity2collider.remove(&entity) {
11011131
context
11021132
.colliders
@@ -1105,7 +1135,13 @@ pub fn sync_removals(
11051135
}
11061136
}
11071137

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

0 commit comments

Comments
 (0)