Skip to content

Commit fd861d7

Browse files
committed
improve determinism by inserting by entity order
1 parent 7b8cf4a commit fd861d7

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

src/plugin/systems.rs

+37
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,12 @@ pub fn init_colliders(
719719
let context = &mut *context;
720720
let physics_scale = context.physics_scale;
721721

722+
#[cfg(feature = "enhanced-determinism")]
723+
{
724+
let mut colliders: Vec<ColliderComponents> = colliders.iter().collect();
725+
colliders.sort_by_key(|f| f.0);
726+
}
727+
722728
for (
723729
entity,
724730
shape,
@@ -836,6 +842,12 @@ pub fn init_rigid_bodies(
836842
) {
837843
let physics_scale = context.physics_scale;
838844

845+
#[cfg(feature = "enhanced-determinism")]
846+
{
847+
let mut rigid_bodies: Vec<RigidBodyComponents> = rigid_bodies.iter().collect();
848+
rigid_bodies.sort_by_key(|f| f.0);
849+
}
850+
839851
for (
840852
entity,
841853
rb,
@@ -979,6 +991,12 @@ pub fn init_joints(
979991
let context = &mut *context;
980992
let scale = context.physics_scale;
981993

994+
#[cfg(feature = "enhanced-determinism")]
995+
{
996+
let mut impulse_joints: Vec<(Entity, &ImpulseJoint)> = impulse_joints.iter().collect();
997+
impulse_joints.sort_by_key(|f| f.0);
998+
}
999+
9821000
for (entity, joint) in impulse_joints.iter() {
9831001
let mut target = None;
9841002
let mut body_entity = entity;
@@ -1003,6 +1021,13 @@ pub fn init_joints(
10031021
}
10041022
}
10051023

1024+
#[cfg(feature = "enhanced-determinism")]
1025+
{
1026+
let mut multibody_joints: Vec<(Entity, &MultibodyJoint)> =
1027+
multibody_joints.iter().collect();
1028+
multibody_joints.sort_by_key(|f| f.0);
1029+
}
1030+
10061031
for (entity, joint) in multibody_joints.iter() {
10071032
let target = context.entity2body.get(&entity);
10081033

@@ -1081,6 +1106,12 @@ pub fn sync_removals(
10811106
/*
10821107
* Collider removal detection.
10831108
*/
1109+
#[cfg(feature = "enhanced-determinism")]
1110+
{
1111+
let mut removed_colliders: Vec<Entity> = removed_colliders.iter().collect();
1112+
removed_colliders.sort();
1113+
}
1114+
10841115
for entity in removed_colliders.iter() {
10851116
if let Some(handle) = context.entity2collider.remove(&entity) {
10861117
context
@@ -1090,6 +1121,12 @@ pub fn sync_removals(
10901121
}
10911122
}
10921123

1124+
#[cfg(feature = "enhanced-determinism")]
1125+
{
1126+
let mut orphan_colliders: Vec<Entity> = orphan_colliders.iter().collect();
1127+
orphan_colliders.sort();
1128+
}
1129+
10931130
for entity in orphan_colliders.iter() {
10941131
if let Some(handle) = context.entity2collider.remove(&entity) {
10951132
context

0 commit comments

Comments
 (0)