Skip to content

Commit d447417

Browse files
committed
Improve determinism with inserting by Entity order
1 parent 3899db0 commit d447417

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
@@ -759,6 +759,12 @@ pub fn init_colliders(
759759
let context = &mut *context;
760760
let physics_scale = context.physics_scale;
761761

762+
let colliders = colliders.iter();
763+
#[cfg(feature = "enhanced-determinism")]
764+
let mut colliders: Vec<(ColliderComponents, Option<&GlobalTransform>)> = colliders.collect();
765+
#[cfg(feature = "enhanced-determinism")]
766+
colliders.sort_unstable_by_key(|f| f.0 .0);
767+
762768
for (
763769
(
764770
entity,
@@ -776,7 +782,7 @@ pub fn init_colliders(
776782
disabled,
777783
),
778784
global_transform,
779-
) in colliders.iter()
785+
) in colliders
780786
{
781787
let mut scaled_shape = shape.clone();
782788
scaled_shape.set_scale(shape.scale / physics_scale, config.scaled_shape_subdivision);
@@ -888,6 +894,12 @@ pub fn init_rigid_bodies(
888894
) {
889895
let physics_scale = context.physics_scale;
890896

897+
let rigid_bodies = rigid_bodies.iter();
898+
#[cfg(feature = "enhanced-determinism")]
899+
let mut rigid_bodies: Vec<RigidBodyComponents> = rigid_bodies.collect();
900+
#[cfg(feature = "enhanced-determinism")]
901+
rigid_bodies.sort_unstable_by_key(|f| f.0);
902+
891903
for (
892904
entity,
893905
rb,
@@ -903,7 +915,7 @@ pub fn init_rigid_bodies(
903915
sleep,
904916
damping,
905917
disabled,
906-
) in rigid_bodies.iter()
918+
) in rigid_bodies
907919
{
908920
let mut builder = RigidBodyBuilder::new((*rb).into());
909921
builder = builder.enabled(disabled.is_none());
@@ -1034,7 +1046,13 @@ pub fn init_joints(
10341046
let context = &mut *context;
10351047
let scale = context.physics_scale;
10361048

1037-
for (entity, joint) in impulse_joints.iter() {
1049+
let impulse_joints = impulse_joints.iter();
1050+
#[cfg(feature = "enhanced-determinism")]
1051+
let mut impulse_joints: Vec<(Entity, &ImpulseJoint)> = impulse_joints.collect();
1052+
#[cfg(feature = "enhanced-determinism")]
1053+
impulse_joints.sort_unstable_by_key(|f| f.0);
1054+
1055+
for (entity, joint) in impulse_joints {
10381056
let mut target = None;
10391057
let mut body_entity = entity;
10401058
while target.is_none() {
@@ -1058,7 +1076,13 @@ pub fn init_joints(
10581076
}
10591077
}
10601078

1061-
for (entity, joint) in multibody_joints.iter() {
1079+
let multibody_joints = multibody_joints.iter();
1080+
#[cfg(feature = "enhanced-determinism")]
1081+
let mut multibody_joints: Vec<(Entity, &MultibodyJoint)> = multibody_joints.collect();
1082+
#[cfg(feature = "enhanced-determinism")]
1083+
multibody_joints.sort_unstable_by_key(|f| f.0);
1084+
1085+
for (entity, joint) in multibody_joints {
10621086
let target = context.entity2body.get(&entity);
10631087

10641088
if let (Some(target), Some(source)) = (target, context.entity2body.get(&joint.parent)) {
@@ -1138,7 +1162,13 @@ pub fn sync_removals(
11381162
/*
11391163
* Collider removal detection.
11401164
*/
1141-
for entity in removed_colliders.iter() {
1165+
let removed_colliders = removed_colliders.iter();
1166+
#[cfg(feature = "enhanced-determinism")]
1167+
let mut removed_colliders: Vec<Entity> = removed_colliders.collect();
1168+
#[cfg(feature = "enhanced-determinism")]
1169+
removed_colliders.sort_unstable();
1170+
1171+
for entity in removed_colliders {
11421172
if let Some(handle) = context.entity2collider.remove(&entity) {
11431173
context
11441174
.colliders
@@ -1147,7 +1177,13 @@ pub fn sync_removals(
11471177
}
11481178
}
11491179

1150-
for entity in orphan_colliders.iter() {
1180+
let orphan_colliders = orphan_colliders.iter();
1181+
#[cfg(feature = "enhanced-determinism")]
1182+
let mut orphan_colliders: Vec<Entity> = orphan_colliders.collect();
1183+
#[cfg(feature = "enhanced-determinism")]
1184+
orphan_colliders.sort_unstable();
1185+
1186+
for entity in orphan_colliders {
11511187
if let Some(handle) = context.entity2collider.remove(&entity) {
11521188
context
11531189
.colliders

0 commit comments

Comments
 (0)