diff --git a/src/plugin/systems.rs b/src/plugin/systems.rs index 6543389c..597e7c7d 100644 --- a/src/plugin/systems.rs +++ b/src/plugin/systems.rs @@ -734,6 +734,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 = colliders.collect(); + #[cfg(feature = "enhanced-determinism")] + colliders.sort_unstable_by_key(|f| f.0); + for ( entity, shape, @@ -747,7 +753,7 @@ pub fn init_colliders( collision_groups, solver_groups, contact_force_event_threshold, - ) in colliders.iter() + ) in colliders { let mut scaled_shape = shape.clone(); scaled_shape.set_scale(shape.scale / physics_scale, config.scaled_shape_subdivision); @@ -851,6 +857,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 = rigid_bodies.collect(); + #[cfg(feature = "enhanced-determinism")] + rigid_bodies.sort_unstable_by_key(|f| f.0); + for ( entity, rb, @@ -865,7 +877,7 @@ pub fn init_rigid_bodies( dominance, sleep, damping, - ) in rigid_bodies.iter() + ) in rigid_bodies { let mut builder = RigidBodyBuilder::new((*rb).into()); if let Some(transform) = transform { @@ -994,7 +1006,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() { @@ -1018,7 +1036,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)) { @@ -1096,7 +1120,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 = 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 @@ -1105,7 +1135,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 = 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