diff --git a/Engine.Physics2D/Abstract/IPhysicsUpdate.cs b/Engine.Physics2D/Abstract/Updates/IPhysicsUpdate.cs similarity index 100% rename from Engine.Physics2D/Abstract/IPhysicsUpdate.cs rename to Engine.Physics2D/Abstract/Updates/IPhysicsUpdate.cs diff --git a/Engine.Physics2D/Abstract/Updates/IPostPhysicsUpdate.cs b/Engine.Physics2D/Abstract/Updates/IPostPhysicsUpdate.cs new file mode 100644 index 0000000..6f368bb --- /dev/null +++ b/Engine.Physics2D/Abstract/Updates/IPostPhysicsUpdate.cs @@ -0,0 +1,15 @@ +using Syntriax.Engine.Core; + +namespace Syntriax.Engine.Physics2D; + +/// +/// Represents a that listens to the phase after the physics simulation phase. +/// +public interface IPostPhysicsUpdate : IBehaviour +{ + /// + /// Execute logic that should occur after the physics simulation has been updated. + /// + /// The time elapsed since the last physics update, typically in seconds. + void PostPhysicsUpdate(float delta); +} diff --git a/Engine.Physics2D/Abstract/Updates/IPrePhysicsUpdate.cs b/Engine.Physics2D/Abstract/Updates/IPrePhysicsUpdate.cs new file mode 100644 index 0000000..acdf352 --- /dev/null +++ b/Engine.Physics2D/Abstract/Updates/IPrePhysicsUpdate.cs @@ -0,0 +1,15 @@ +using Syntriax.Engine.Core; + +namespace Syntriax.Engine.Physics2D; + +/// +/// Represents a that listens to the phase before the physics simulation phase. +/// +public interface IPrePhysicsUpdate : IBehaviour +{ + /// + /// Execute logic that should occur before the physics simulation is updated. + /// + /// The time elapsed since the last physics update, typically in seconds. + void PrePhysicsUpdate(float delta); +} diff --git a/Engine.Physics2D/PhysicsEngine2D.cs b/Engine.Physics2D/PhysicsEngine2D.cs index 6ad2d6d..bc89f29 100644 --- a/Engine.Physics2D/PhysicsEngine2D.cs +++ b/Engine.Physics2D/PhysicsEngine2D.cs @@ -14,9 +14,12 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D protected readonly ICollisionDetector2D collisionDetector = null!; protected readonly ICollisionResolver2D collisionResolver = null!; + private static System.Comparison SortByPriority() => (x, y) => y.Priority.CompareTo(x.Priority); + protected ActiveBehaviourCollectorSorted physicsPreUpdateCollector = new() { SortBy = SortByPriority() }; + protected ActiveBehaviourCollectorSorted physicsUpdateCollector = new() { SortBy = SortByPriority() }; + protected ActiveBehaviourCollectorSorted physicsPostUpdateCollector = new() { SortBy = SortByPriority() }; protected BehaviourCollector rigidBodyCollector = new(); protected BehaviourCollector colliderCollector = new(); - protected BehaviourCollector physicsUpdateCollector = new(); public int IterationPerStep { get => _iterationPerStep; set => _iterationPerStep = value < 1 ? 1 : value; } public float IterationPeriod { get => _iterationPeriod; set => _iterationPeriod = value.Max(0.0001f); } @@ -25,6 +28,12 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D { float intervalDeltaTime = deltaTime / IterationPerStep; + foreach (IPrePhysicsUpdate physicsPreUpdate in physicsPreUpdateCollector) + physicsPreUpdate.PrePhysicsUpdate(deltaTime); + + foreach (IPhysicsUpdate physicsUpdate in physicsUpdateCollector) + physicsUpdate.PhysicsUpdate(deltaTime); + for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++) { // Can Parallel @@ -92,8 +101,8 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D OnPhysicsIteration?.InvokeSafe(this, intervalDeltaTime); } - foreach (IPhysicsUpdate physicsUpdate in physicsUpdateCollector) - physicsUpdate.PhysicsUpdate(deltaTime); + foreach (IPostPhysicsUpdate physicsPostUpdate in physicsPostUpdateCollector) + physicsPostUpdate.PostPhysicsUpdate(deltaTime); OnPhysicsStep?.InvokeSafe(this, deltaTime); } @@ -109,7 +118,9 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D protected override void OnEnteringUniverse(IUniverse universe) { + physicsPreUpdateCollector.Assign(universe); physicsUpdateCollector.Assign(universe); + physicsPostUpdateCollector.Assign(universe); colliderCollector.Assign(universe); rigidBodyCollector.Assign(universe); @@ -118,7 +129,9 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D protected override void OnExitingUniverse(IUniverse universe) { + physicsPreUpdateCollector.Unassign(); physicsUpdateCollector.Unassign(); + physicsPostUpdateCollector.Unassign(); colliderCollector.Unassign(); rigidBodyCollector.Unassign();