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();