Compare commits
2 Commits
c7f63dc638
...
fbdea47dc7
Author | SHA1 | Date | |
---|---|---|---|
fbdea47dc7 | |||
f5fbd4e5ef |
15
Engine.Physics2D/Abstract/Updates/IPhysicsIteration.cs
Normal file
15
Engine.Physics2D/Abstract/Updates/IPhysicsIteration.cs
Normal 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);
|
||||||
|
}
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user