From f5fbd4e5efb2da46b989fdc3811a6b4207b2ffee Mon Sep 17 00:00:00 2001 From: Syntriax Date: Thu, 5 Jun 2025 23:17:17 +0300 Subject: [PATCH] feat: IPhysicsIteration interface added --- .../Abstract/Updates/IPhysicsIteration.cs | 15 +++++++++++++ Engine.Physics2D/PhysicsEngine2D.cs | 21 +++++++++++++------ Engine.Physics2D/PhysicsEngine2DStandalone.cs | 21 ++++++++++++------- 3 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 Engine.Physics2D/Abstract/Updates/IPhysicsIteration.cs diff --git a/Engine.Physics2D/Abstract/Updates/IPhysicsIteration.cs b/Engine.Physics2D/Abstract/Updates/IPhysicsIteration.cs new file mode 100644 index 0000000..103837a --- /dev/null +++ b/Engine.Physics2D/Abstract/Updates/IPhysicsIteration.cs @@ -0,0 +1,15 @@ +using Syntriax.Engine.Core; + +namespace Syntriax.Engine.Physics2D; + +/// +/// Represents a that listens to physics simulation update phase. +/// +public interface IPhysicsIteration : IBehaviour +{ + /// + /// Iterates the physics state of the object based on the elapsed time since the last iteration. + /// + /// The time elapsed since the last physics iteration. + void PhysicsIterate(float delta); +} diff --git a/Engine.Physics2D/PhysicsEngine2D.cs b/Engine.Physics2D/PhysicsEngine2D.cs index a5a3b18..725e063 100644 --- a/Engine.Physics2D/PhysicsEngine2D.cs +++ b/Engine.Physics2D/PhysicsEngine2D.cs @@ -21,6 +21,7 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D private static Comparer SortByPriority() => Comparer.Create((x, y) => y.Priority.CompareTo(x.Priority)); protected ActiveBehaviourCollectorSorted physicsPreUpdateCollector = new() { SortBy = SortByPriority() }; protected ActiveBehaviourCollectorSorted physicsUpdateCollector = new() { SortBy = SortByPriority() }; + protected ActiveBehaviourCollectorSorted physicsIterationCollector = new() { SortBy = SortByPriority() }; protected ActiveBehaviourCollectorSorted physicsPostUpdateCollector = new() { SortBy = SortByPriority() }; protected BehaviourCollector rigidBodyCollector = new(); protected BehaviourCollector colliderCollector = new(); @@ -40,6 +41,9 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++) { + for (int i = physicsIterationCollector.Count - 1; i >= 0; i--) + physicsIterationCollector[i].PhysicsIterate(intervalDeltaTime); + // Can Parallel for (int i = rigidBodyCollector.Count - 1; i >= 0; i--) StepRigidBody(rigidBodyCollector[i], intervalDeltaTime); @@ -82,21 +86,26 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D List childColliders = []; List physicsPreUpdates = []; List physicsUpdates = []; + List physicsIterations = []; List physicsPostUpdates = []; rigidBody.BehaviourController.GetBehavioursInChildren(childColliders); rigidBody.BehaviourController.GetBehavioursInChildren(physicsPreUpdates); rigidBody.BehaviourController.GetBehavioursInChildren(physicsUpdates); + rigidBody.BehaviourController.GetBehavioursInChildren(physicsIterations); rigidBody.BehaviourController.GetBehavioursInChildren(physicsPostUpdates); - foreach (IPrePhysicsUpdate physicsPreUpdate in physicsPreUpdates) - physicsPreUpdate.PrePhysicsUpdate(deltaTime); + for (int i = physicsPreUpdates.Count - 1; i >= 0; i--) + physicsPreUpdates[i].PrePhysicsUpdate(deltaTime); - foreach (IPhysicsUpdate physicsUpdate in physicsUpdates) - physicsUpdate.PhysicsUpdate(deltaTime); + for (int i = physicsUpdates.Count - 1; i >= 0; i--) + physicsUpdates[i].PhysicsUpdate(deltaTime); for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++) { + for (int i = physicsIterations.Count - 1; i >= 0; i--) + physicsIterations[i].PhysicsIterate(intervalDeltaTime); + StepRigidBody(rigidBody, intervalDeltaTime); for (int i = childColliders.Count - 1; i >= 0; i--) @@ -120,8 +129,8 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D } } - foreach (IPostPhysicsUpdate physicsPostUpdate in physicsPostUpdates) - physicsPostUpdate.PostPhysicsUpdate(deltaTime); + for (int i = physicsPostUpdates.Count - 1; i >= 0; i--) + physicsPostUpdates[i].PostPhysicsUpdate(deltaTime); } private void ResolveColliders(ICollider2D colliderX, ICollider2D colliderY) diff --git a/Engine.Physics2D/PhysicsEngine2DStandalone.cs b/Engine.Physics2D/PhysicsEngine2DStandalone.cs index 66bf714..fffdba7 100644 --- a/Engine.Physics2D/PhysicsEngine2DStandalone.cs +++ b/Engine.Physics2D/PhysicsEngine2DStandalone.cs @@ -86,25 +86,30 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D List childColliders = []; List physicsPreUpdates = []; List physicsUpdates = []; + List physicsIterations = []; List physicsPostUpdates = []; rigidBody.BehaviourController.GetBehavioursInChildren(childColliders); rigidBody.BehaviourController.GetBehavioursInChildren(physicsPreUpdates); rigidBody.BehaviourController.GetBehavioursInChildren(physicsUpdates); + rigidBody.BehaviourController.GetBehavioursInChildren(physicsIterations); rigidBody.BehaviourController.GetBehavioursInChildren(physicsPostUpdates); - foreach (IPrePhysicsUpdate physicsPreUpdate in physicsPreUpdates) - physicsPreUpdate.PrePhysicsUpdate(deltaTime); + for (int i = physicsPreUpdates.Count - 1; i >= 0; i--) + physicsPreUpdates[i].PrePhysicsUpdate(deltaTime); - foreach (IPhysicsUpdate physicsUpdate in physicsUpdates) - physicsUpdate.PhysicsUpdate(deltaTime); + for (int i = physicsUpdates.Count - 1; i >= 0; i--) + physicsUpdates[i].PhysicsUpdate(deltaTime); for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++) { + for (int i = physicsIterations.Count - 1; i >= 0; i--) + physicsIterations[i].PhysicsIterate(intervalDeltaTime); + StepRigidBody(rigidBody, intervalDeltaTime); - foreach (ICollider2D collider in childColliders) - collider.Recalculate(); + for (int i = childColliders.Count - 1; i >= 0; i--) + childColliders[i].Recalculate(); for (int x = 0; x < childColliders.Count; x++) { @@ -124,8 +129,8 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D } } - foreach (IPostPhysicsUpdate physicsPostUpdate in physicsPostUpdates) - physicsPostUpdate.PostPhysicsUpdate(deltaTime); + for (int i = physicsPostUpdates.Count - 1; i >= 0; i--) + physicsPostUpdates[i].PostPhysicsUpdate(deltaTime); } private void ResolveColliders(ICollider2D colliderX, ICollider2D colliderY)