Skip to content

Commit 435242a

Browse files
committed
Improve determinism with inserting by Entity order
1 parent cec05c3 commit 435242a

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
@@ -851,6 +851,12 @@ pub fn init_colliders(
851851
let context = &mut *context;
852852
let physics_scale = context.physics_scale;
853853

854+
let colliders = colliders.iter();
855+
#[cfg(feature = "enhanced-determinism")]
856+
let mut colliders: Vec<(ColliderComponents, Option<&GlobalTransform>)> = colliders.collect();
857+
#[cfg(feature = "enhanced-determinism")]
858+
colliders.sort_unstable_by_key(|f| f.0 .0);
859+
854860
for (
855861
(
856862
entity,
@@ -868,7 +874,7 @@ pub fn init_colliders(
868874
disabled,
869875
),
870876
global_transform,
871-
) in colliders.iter()
877+
) in colliders
872878
{
873879
let mut scaled_shape = shape.clone();
874880
scaled_shape.set_scale(shape.scale / physics_scale, config.scaled_shape_subdivision);
@@ -968,6 +974,12 @@ pub fn init_rigid_bodies(
968974
) {
969975
let physics_scale = context.physics_scale;
970976

977+
let rigid_bodies = rigid_bodies.iter();
978+
#[cfg(feature = "enhanced-determinism")]
979+
let mut rigid_bodies: Vec<RigidBodyComponents> = rigid_bodies.collect();
980+
#[cfg(feature = "enhanced-determinism")]
981+
rigid_bodies.sort_unstable_by_key(|f| f.0);
982+
971983
for (
972984
entity,
973985
rb,
@@ -983,7 +995,7 @@ pub fn init_rigid_bodies(
983995
sleep,
984996
damping,
985997
disabled,
986-
) in rigid_bodies.iter()
998+
) in rigid_bodies
987999
{
9881000
let mut builder = RigidBodyBuilder::new((*rb).into());
9891001
builder = builder.enabled(disabled.is_none());
@@ -1114,7 +1126,13 @@ pub fn init_joints(
11141126
let context = &mut *context;
11151127
let scale = context.physics_scale;
11161128

1117-
for (entity, joint) in impulse_joints.iter() {
1129+
let impulse_joints = impulse_joints.iter();
1130+
#[cfg(feature = "enhanced-determinism")]
1131+
let mut impulse_joints: Vec<(Entity, &ImpulseJoint)> = impulse_joints.collect();
1132+
#[cfg(feature = "enhanced-determinism")]
1133+
impulse_joints.sort_unstable_by_key(|f| f.0);
1134+
1135+
for (entity, joint) in impulse_joints {
11181136
let mut target = None;
11191137
let mut body_entity = entity;
11201138
while target.is_none() {
@@ -1138,7 +1156,13 @@ pub fn init_joints(
11381156
}
11391157
}
11401158

1141-
for (entity, joint) in multibody_joints.iter() {
1159+
let multibody_joints = multibody_joints.iter();
1160+
#[cfg(feature = "enhanced-determinism")]
1161+
let mut multibody_joints: Vec<(Entity, &MultibodyJoint)> = multibody_joints.collect();
1162+
#[cfg(feature = "enhanced-determinism")]
1163+
multibody_joints.sort_unstable_by_key(|f| f.0);
1164+
1165+
for (entity, joint) in multibody_joints {
11421166
let target = context.entity2body.get(&entity);
11431167

11441168
if let (Some(target), Some(source)) = (target, context.entity2body.get(&joint.parent)) {
@@ -1220,7 +1244,13 @@ pub fn sync_removals(
12201244
/*
12211245
* Collider removal detection.
12221246
*/
1223-
for entity in removed_colliders.read() {
1247+
let removed_colliders = removed_colliders.read();
1248+
#[cfg(feature = "enhanced-determinism")]
1249+
let mut removed_colliders: Vec<Entity> = removed_colliders.collect();
1250+
#[cfg(feature = "enhanced-determinism")]
1251+
removed_colliders.sort_unstable();
1252+
1253+
for entity in removed_colliders {
12241254
if let Some(parent) = context.collider_parent(entity) {
12251255
mass_modified.send(parent.into());
12261256
}
@@ -1233,7 +1263,13 @@ pub fn sync_removals(
12331263
}
12341264
}
12351265

1236-
for entity in orphan_colliders.iter() {
1266+
let orphan_colliders = orphan_colliders.iter();
1267+
#[cfg(feature = "enhanced-determinism")]
1268+
let mut orphan_colliders: Vec<Entity> = orphan_colliders.collect();
1269+
#[cfg(feature = "enhanced-determinism")]
1270+
orphan_colliders.sort_unstable();
1271+
1272+
for entity in orphan_colliders {
12371273
if let Some(parent) = context.collider_parent(entity) {
12381274
mass_modified.send(parent.into());
12391275
}

0 commit comments

Comments
 (0)