2 Commits

6 changed files with 48 additions and 17 deletions

View File

@@ -0,0 +1,15 @@
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Physics2D;
/// <summary>
/// Represents a <see cref="IBehaviour"/> that listens to physics simulation update phase.
/// </summary>
public interface IPhysicsIteration : IBehaviour
{
/// <summary>
/// Iterates the physics state of the object based on the elapsed time since the last iteration.
/// </summary>
/// <param name="delta">The time elapsed since the last physics iteration.</param>
void PhysicsIterate(float delta);
}

View File

@@ -10,6 +10,6 @@ public interface IPhysicsUpdate : IBehaviour
/// <summary> /// <summary>
/// Updates the physics state of the object based on the elapsed time since the last update. /// Updates the physics state of the object based on the elapsed time since the last update.
/// </summary> /// </summary>
/// <param name="delta">The time elapsed since the last physics update, typically in seconds.</param> /// <param name="delta">The time elapsed since the last physics update.</param>
void PhysicsUpdate(float delta); void PhysicsUpdate(float delta);
} }

View File

@@ -10,6 +10,6 @@ public interface IPostPhysicsUpdate : IBehaviour
/// <summary> /// <summary>
/// Execute logic that should occur after the physics simulation has been updated. /// Execute logic that should occur after the physics simulation has been updated.
/// </summary> /// </summary>
/// <param name="delta">The time elapsed since the last physics update, typically in seconds.</param> /// <param name="delta">The time elapsed since the last physics update.</param>
void PostPhysicsUpdate(float delta); void PostPhysicsUpdate(float delta);
} }

View File

@@ -10,6 +10,6 @@ public interface IPrePhysicsUpdate : IBehaviour
/// <summary> /// <summary>
/// Execute logic that should occur before the physics simulation is updated. /// Execute logic that should occur before the physics simulation is updated.
/// </summary> /// </summary>
/// <param name="delta">The time elapsed since the last physics update, typically in seconds.</param> /// <param name="delta">The time elapsed since the last physics update.</param>
void PrePhysicsUpdate(float delta); void PrePhysicsUpdate(float delta);
} }

View File

@@ -21,6 +21,7 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D
private static Comparer<IBehaviour> SortByPriority() => Comparer<IBehaviour>.Create((x, y) => y.Priority.CompareTo(x.Priority)); private static Comparer<IBehaviour> SortByPriority() => Comparer<IBehaviour>.Create((x, y) => y.Priority.CompareTo(x.Priority));
protected ActiveBehaviourCollectorSorted<IPrePhysicsUpdate> physicsPreUpdateCollector = new() { SortBy = SortByPriority() }; protected ActiveBehaviourCollectorSorted<IPrePhysicsUpdate> physicsPreUpdateCollector = new() { SortBy = SortByPriority() };
protected ActiveBehaviourCollectorSorted<IPhysicsUpdate> physicsUpdateCollector = new() { SortBy = SortByPriority() }; protected ActiveBehaviourCollectorSorted<IPhysicsUpdate> physicsUpdateCollector = new() { SortBy = SortByPriority() };
protected ActiveBehaviourCollectorSorted<IPhysicsIteration> physicsIterationCollector = new() { SortBy = SortByPriority() };
protected ActiveBehaviourCollectorSorted<IPostPhysicsUpdate> physicsPostUpdateCollector = new() { SortBy = SortByPriority() }; protected ActiveBehaviourCollectorSorted<IPostPhysicsUpdate> physicsPostUpdateCollector = new() { SortBy = SortByPriority() };
protected BehaviourCollector<IRigidBody2D> rigidBodyCollector = new(); protected BehaviourCollector<IRigidBody2D> rigidBodyCollector = new();
protected BehaviourCollector<ICollider2D> colliderCollector = new(); protected BehaviourCollector<ICollider2D> colliderCollector = new();
@@ -40,6 +41,9 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D
for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++) for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++)
{ {
for (int i = physicsIterationCollector.Count - 1; i >= 0; i--)
physicsIterationCollector[i].PhysicsIterate(intervalDeltaTime);
// Can Parallel // Can Parallel
for (int i = rigidBodyCollector.Count - 1; i >= 0; i--) for (int i = rigidBodyCollector.Count - 1; i >= 0; i--)
StepRigidBody(rigidBodyCollector[i], intervalDeltaTime); StepRigidBody(rigidBodyCollector[i], intervalDeltaTime);
@@ -82,21 +86,26 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D
List<ICollider2D> childColliders = []; List<ICollider2D> childColliders = [];
List<IPrePhysicsUpdate> physicsPreUpdates = []; List<IPrePhysicsUpdate> physicsPreUpdates = [];
List<IPhysicsUpdate> physicsUpdates = []; List<IPhysicsUpdate> physicsUpdates = [];
List<IPhysicsIteration> physicsIterations = [];
List<IPostPhysicsUpdate> physicsPostUpdates = []; List<IPostPhysicsUpdate> physicsPostUpdates = [];
rigidBody.BehaviourController.GetBehavioursInChildren(childColliders); rigidBody.BehaviourController.GetBehavioursInChildren(childColliders);
rigidBody.BehaviourController.GetBehavioursInChildren(physicsPreUpdates); rigidBody.BehaviourController.GetBehavioursInChildren(physicsPreUpdates);
rigidBody.BehaviourController.GetBehavioursInChildren(physicsUpdates); rigidBody.BehaviourController.GetBehavioursInChildren(physicsUpdates);
rigidBody.BehaviourController.GetBehavioursInChildren(physicsIterations);
rigidBody.BehaviourController.GetBehavioursInChildren(physicsPostUpdates); rigidBody.BehaviourController.GetBehavioursInChildren(physicsPostUpdates);
foreach (IPrePhysicsUpdate physicsPreUpdate in physicsPreUpdates) for (int i = physicsPreUpdates.Count - 1; i >= 0; i--)
physicsPreUpdate.PrePhysicsUpdate(deltaTime); physicsPreUpdates[i].PrePhysicsUpdate(deltaTime);
foreach (IPhysicsUpdate physicsUpdate in physicsUpdates) for (int i = physicsUpdates.Count - 1; i >= 0; i--)
physicsUpdate.PhysicsUpdate(deltaTime); physicsUpdates[i].PhysicsUpdate(deltaTime);
for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++) for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++)
{ {
for (int i = physicsIterations.Count - 1; i >= 0; i--)
physicsIterations[i].PhysicsIterate(intervalDeltaTime);
StepRigidBody(rigidBody, intervalDeltaTime); StepRigidBody(rigidBody, intervalDeltaTime);
for (int i = childColliders.Count - 1; i >= 0; i--) for (int i = childColliders.Count - 1; i >= 0; i--)
@@ -120,8 +129,8 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D
} }
} }
foreach (IPostPhysicsUpdate physicsPostUpdate in physicsPostUpdates) for (int i = physicsPostUpdates.Count - 1; i >= 0; i--)
physicsPostUpdate.PostPhysicsUpdate(deltaTime); physicsPostUpdates[i].PostPhysicsUpdate(deltaTime);
} }
private void ResolveColliders(ICollider2D colliderX, ICollider2D colliderY) private void ResolveColliders(ICollider2D colliderX, ICollider2D colliderY)
@@ -178,6 +187,7 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D
{ {
physicsPreUpdateCollector.Assign(universe); physicsPreUpdateCollector.Assign(universe);
physicsUpdateCollector.Assign(universe); physicsUpdateCollector.Assign(universe);
physicsIterationCollector.Assign(universe);
physicsPostUpdateCollector.Assign(universe); physicsPostUpdateCollector.Assign(universe);
colliderCollector.Assign(universe); colliderCollector.Assign(universe);
rigidBodyCollector.Assign(universe); rigidBodyCollector.Assign(universe);
@@ -189,6 +199,7 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D
{ {
physicsPreUpdateCollector.Unassign(); physicsPreUpdateCollector.Unassign();
physicsUpdateCollector.Unassign(); physicsUpdateCollector.Unassign();
physicsIterationCollector.Unassign();
physicsPostUpdateCollector.Unassign(); physicsPostUpdateCollector.Unassign();
colliderCollector.Unassign(); colliderCollector.Unassign();
rigidBodyCollector.Unassign(); rigidBodyCollector.Unassign();

View File

@@ -86,25 +86,30 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
List<ICollider2D> childColliders = []; List<ICollider2D> childColliders = [];
List<IPrePhysicsUpdate> physicsPreUpdates = []; List<IPrePhysicsUpdate> physicsPreUpdates = [];
List<IPhysicsUpdate> physicsUpdates = []; List<IPhysicsUpdate> physicsUpdates = [];
List<IPhysicsIteration> physicsIterations = [];
List<IPostPhysicsUpdate> physicsPostUpdates = []; List<IPostPhysicsUpdate> physicsPostUpdates = [];
rigidBody.BehaviourController.GetBehavioursInChildren(childColliders); rigidBody.BehaviourController.GetBehavioursInChildren(childColliders);
rigidBody.BehaviourController.GetBehavioursInChildren(physicsPreUpdates); rigidBody.BehaviourController.GetBehavioursInChildren(physicsPreUpdates);
rigidBody.BehaviourController.GetBehavioursInChildren(physicsUpdates); rigidBody.BehaviourController.GetBehavioursInChildren(physicsUpdates);
rigidBody.BehaviourController.GetBehavioursInChildren(physicsIterations);
rigidBody.BehaviourController.GetBehavioursInChildren(physicsPostUpdates); rigidBody.BehaviourController.GetBehavioursInChildren(physicsPostUpdates);
foreach (IPrePhysicsUpdate physicsPreUpdate in physicsPreUpdates) for (int i = physicsPreUpdates.Count - 1; i >= 0; i--)
physicsPreUpdate.PrePhysicsUpdate(deltaTime); physicsPreUpdates[i].PrePhysicsUpdate(deltaTime);
foreach (IPhysicsUpdate physicsUpdate in physicsUpdates) for (int i = physicsUpdates.Count - 1; i >= 0; i--)
physicsUpdate.PhysicsUpdate(deltaTime); physicsUpdates[i].PhysicsUpdate(deltaTime);
for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++) for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++)
{ {
for (int i = physicsIterations.Count - 1; i >= 0; i--)
physicsIterations[i].PhysicsIterate(intervalDeltaTime);
StepRigidBody(rigidBody, intervalDeltaTime); StepRigidBody(rigidBody, intervalDeltaTime);
foreach (ICollider2D collider in childColliders) for (int i = childColliders.Count - 1; i >= 0; i--)
collider.Recalculate(); childColliders[i].Recalculate();
for (int x = 0; x < childColliders.Count; x++) for (int x = 0; x < childColliders.Count; x++)
{ {
@@ -124,8 +129,8 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
} }
} }
foreach (IPostPhysicsUpdate physicsPostUpdate in physicsPostUpdates) for (int i = physicsPostUpdates.Count - 1; i >= 0; i--)
physicsPostUpdate.PostPhysicsUpdate(deltaTime); physicsPostUpdates[i].PostPhysicsUpdate(deltaTime);
} }
private void ResolveColliders(ICollider2D colliderX, ICollider2D colliderY) private void ResolveColliders(ICollider2D colliderX, ICollider2D colliderY)