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>
 | 
			
		||||
    /// Updates the physics state of the object based on the elapsed time since the last update.
 | 
			
		||||
    /// </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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,6 @@ public interface IPostPhysicsUpdate : IBehaviour
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Execute logic that should occur after the physics simulation has been updated.
 | 
			
		||||
    /// </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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,6 @@ public interface IPrePhysicsUpdate : IBehaviour
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Execute logic that should occur before the physics simulation is updated.
 | 
			
		||||
    /// </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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D
 | 
			
		||||
    private static Comparer<IBehaviour> SortByPriority() => Comparer<IBehaviour>.Create((x, y) => y.Priority.CompareTo(x.Priority));
 | 
			
		||||
    protected ActiveBehaviourCollectorSorted<IPrePhysicsUpdate> physicsPreUpdateCollector = 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 BehaviourCollector<IRigidBody2D> rigidBodyCollector = new();
 | 
			
		||||
    protected BehaviourCollector<ICollider2D> 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<ICollider2D> childColliders = [];
 | 
			
		||||
        List<IPrePhysicsUpdate> physicsPreUpdates = [];
 | 
			
		||||
        List<IPhysicsUpdate> physicsUpdates = [];
 | 
			
		||||
        List<IPhysicsIteration> physicsIterations = [];
 | 
			
		||||
        List<IPostPhysicsUpdate> 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)
 | 
			
		||||
@@ -178,6 +187,7 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D
 | 
			
		||||
    {
 | 
			
		||||
        physicsPreUpdateCollector.Assign(universe);
 | 
			
		||||
        physicsUpdateCollector.Assign(universe);
 | 
			
		||||
        physicsIterationCollector.Assign(universe);
 | 
			
		||||
        physicsPostUpdateCollector.Assign(universe);
 | 
			
		||||
        colliderCollector.Assign(universe);
 | 
			
		||||
        rigidBodyCollector.Assign(universe);
 | 
			
		||||
@@ -189,6 +199,7 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D
 | 
			
		||||
    {
 | 
			
		||||
        physicsPreUpdateCollector.Unassign();
 | 
			
		||||
        physicsUpdateCollector.Unassign();
 | 
			
		||||
        physicsIterationCollector.Unassign();
 | 
			
		||||
        physicsPostUpdateCollector.Unassign();
 | 
			
		||||
        colliderCollector.Unassign();
 | 
			
		||||
        rigidBodyCollector.Unassign();
 | 
			
		||||
 
 | 
			
		||||
@@ -86,25 +86,30 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
 | 
			
		||||
        List<ICollider2D> childColliders = [];
 | 
			
		||||
        List<IPrePhysicsUpdate> physicsPreUpdates = [];
 | 
			
		||||
        List<IPhysicsUpdate> physicsUpdates = [];
 | 
			
		||||
        List<IPhysicsIteration> physicsIterations = [];
 | 
			
		||||
        List<IPostPhysicsUpdate> 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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user