Skip to content

Commit

Permalink
Improve determinism with inserting by Entity order
Browse files Browse the repository at this point in the history
  • Loading branch information
cscorley committed Jan 15, 2023
1 parent 3899db0 commit d447417
Showing 1 changed file with 42 additions and 6 deletions.
48 changes: 42 additions & 6 deletions src/plugin/systems.rs
Original file line number Diff line number Diff line change
Expand Up @@ -759,6 +759,12 @@ pub fn init_colliders(
let context = &mut *context;
let physics_scale = context.physics_scale;

let colliders = colliders.iter();
#[cfg(feature = "enhanced-determinism")]
let mut colliders: Vec<(ColliderComponents, Option<&GlobalTransform>)> = colliders.collect();
#[cfg(feature = "enhanced-determinism")]
colliders.sort_unstable_by_key(|f| f.0 .0);

for (
(
entity,
Expand All @@ -776,7 +782,7 @@ pub fn init_colliders(
disabled,
),
global_transform,
) in colliders.iter()
) in colliders
{
let mut scaled_shape = shape.clone();
scaled_shape.set_scale(shape.scale / physics_scale, config.scaled_shape_subdivision);
Expand Down Expand Up @@ -888,6 +894,12 @@ pub fn init_rigid_bodies(
) {
let physics_scale = context.physics_scale;

let rigid_bodies = rigid_bodies.iter();
#[cfg(feature = "enhanced-determinism")]
let mut rigid_bodies: Vec<RigidBodyComponents> = rigid_bodies.collect();
#[cfg(feature = "enhanced-determinism")]
rigid_bodies.sort_unstable_by_key(|f| f.0);

for (
entity,
rb,
Expand All @@ -903,7 +915,7 @@ pub fn init_rigid_bodies(
sleep,
damping,
disabled,
) in rigid_bodies.iter()
) in rigid_bodies
{
let mut builder = RigidBodyBuilder::new((*rb).into());
builder = builder.enabled(disabled.is_none());
Expand Down Expand Up @@ -1034,7 +1046,13 @@ pub fn init_joints(
let context = &mut *context;
let scale = context.physics_scale;

for (entity, joint) in impulse_joints.iter() {
let impulse_joints = impulse_joints.iter();
#[cfg(feature = "enhanced-determinism")]
let mut impulse_joints: Vec<(Entity, &ImpulseJoint)> = impulse_joints.collect();
#[cfg(feature = "enhanced-determinism")]
impulse_joints.sort_unstable_by_key(|f| f.0);

for (entity, joint) in impulse_joints {
let mut target = None;
let mut body_entity = entity;
while target.is_none() {
Expand All @@ -1058,7 +1076,13 @@ pub fn init_joints(
}
}

for (entity, joint) in multibody_joints.iter() {
let multibody_joints = multibody_joints.iter();
#[cfg(feature = "enhanced-determinism")]
let mut multibody_joints: Vec<(Entity, &MultibodyJoint)> = multibody_joints.collect();
#[cfg(feature = "enhanced-determinism")]
multibody_joints.sort_unstable_by_key(|f| f.0);

for (entity, joint) in multibody_joints {
let target = context.entity2body.get(&entity);

if let (Some(target), Some(source)) = (target, context.entity2body.get(&joint.parent)) {
Expand Down Expand Up @@ -1138,7 +1162,13 @@ pub fn sync_removals(
/*
* Collider removal detection.
*/
for entity in removed_colliders.iter() {
let removed_colliders = removed_colliders.iter();
#[cfg(feature = "enhanced-determinism")]
let mut removed_colliders: Vec<Entity> = removed_colliders.collect();
#[cfg(feature = "enhanced-determinism")]
removed_colliders.sort_unstable();

for entity in removed_colliders {
if let Some(handle) = context.entity2collider.remove(&entity) {
context
.colliders
Expand All @@ -1147,7 +1177,13 @@ pub fn sync_removals(
}
}

for entity in orphan_colliders.iter() {
let orphan_colliders = orphan_colliders.iter();
#[cfg(feature = "enhanced-determinism")]
let mut orphan_colliders: Vec<Entity> = orphan_colliders.collect();
#[cfg(feature = "enhanced-determinism")]
orphan_colliders.sort_unstable();

for entity in orphan_colliders {
if let Some(handle) = context.entity2collider.remove(&entity) {
context
.colliders
Expand Down

0 comments on commit d447417

Please sign in to comment.