From f119a23d2b33777a5196c1cc5da0c08ba4b0fe12 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Tue, 8 Apr 2025 20:29:53 +0300 Subject: [PATCH] feat: added IGameManager.OnPreUpdate event --- Engine.Core/Abstract/IGameManager.cs | 11 +- Engine.Core/GameManager.cs | 5 +- Engine.Physics2D/PhysicsEngine2DCollector.cs | 133 ------------------- 3 files changed, 12 insertions(+), 137 deletions(-) delete mode 100644 Engine.Physics2D/PhysicsEngine2DCollector.cs diff --git a/Engine.Core/Abstract/IGameManager.cs b/Engine.Core/Abstract/IGameManager.cs index f573639..96e0377 100644 --- a/Engine.Core/Abstract/IGameManager.cs +++ b/Engine.Core/Abstract/IGameManager.cs @@ -8,14 +8,19 @@ namespace Syntriax.Engine.Core.Abstract; public interface IGameManager : IEntity, IEnumerable { /// - /// Event triggered when is called on the . + /// Event triggered when is about to be called called on the . + /// + event UpdateEventHandler? OnPreUpdate; + + /// + /// Event triggered when is called on the . /// event UpdateEventHandler? OnUpdate; /// /// Event triggered when is called on the . /// - event PreDawEventHandler? OnPreDraw; + event PreDrawEventHandler? OnPreDraw; /// /// Event triggered when a is registered to the . @@ -69,7 +74,7 @@ public interface IGameManager : IEntity, IEnumerable void PreDraw(); delegate void UpdateEventHandler(IGameManager sender, EngineTime engineTime); - delegate void PreDawEventHandler(IGameManager sender); + delegate void PreDrawEventHandler(IGameManager sender); delegate void HierarchyObjectRegisteredEventHandler(IGameManager sender, IHierarchyObject hierarchyObjectRegistered); delegate void HierarchyObjectUnRegisteredEventHandler(IGameManager sender, IHierarchyObject hierarchyObjectUnregistered); diff --git a/Engine.Core/GameManager.cs b/Engine.Core/GameManager.cs index db797d3..4aa725a 100644 --- a/Engine.Core/GameManager.cs +++ b/Engine.Core/GameManager.cs @@ -10,8 +10,9 @@ namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("HierarchyObject Count: {_hierarchyObjects.Count}")] public class GameManager : BaseEntity, IGameManager { + public event IGameManager.UpdateEventHandler? OnPreUpdate = null; public event IGameManager.UpdateEventHandler? OnUpdate = null; - public event IGameManager.PreDawEventHandler? OnPreDraw = null; + public event IGameManager.PreDrawEventHandler? OnPreDraw = null; public event IGameManager.HierarchyObjectRegisteredEventHandler? OnHierarchyObjectRegistered = null; public event IGameManager.HierarchyObjectUnRegisteredEventHandler? OnHierarchyObjectUnRegistered = null; @@ -109,6 +110,8 @@ public class GameManager : BaseEntity, IGameManager { Time = engineTime; + OnPreUpdate?.Invoke(this, engineTime); + for (int i = 0; i < HierarchyObjects.Count; i++) HierarchyObjects[i].BehaviourController.Update(); diff --git a/Engine.Physics2D/PhysicsEngine2DCollector.cs b/Engine.Physics2D/PhysicsEngine2DCollector.cs deleted file mode 100644 index 8a10a63..0000000 --- a/Engine.Physics2D/PhysicsEngine2DCollector.cs +++ /dev/null @@ -1,133 +0,0 @@ -using Syntriax.Engine.Core; -using Syntriax.Engine.Core.Abstract; -using Syntriax.Engine.Physics2D.Abstract; - -namespace Syntriax.Engine.Physics2D; - -public class PhysicsEngine2DCollector : HierarchyObject, IPhysicsEngine2D -{ - public event IPhysicsEngine2D.PhysicsIterationEventHandler? OnPhysicsIteration = null; - public event IPhysicsEngine2D.PhysicsStepEventHandler? OnPhysicsStep = null; - - private int _iterationPerStep = 1; - - protected readonly ICollisionDetector2D collisionDetector = null!; - protected readonly ICollisionResolver2D collisionResolver = null!; - - protected BehaviourCollector rigidBodyCollector = new(); - protected BehaviourCollector colliderCollector = new(); - protected BehaviourCollector physicsUpdateCollector = new(); - - public int IterationPerStep { get => _iterationPerStep; set => _iterationPerStep = value < 1 ? 1 : value; } - - public void Step(float deltaTime) - { - float intervalDeltaTime = deltaTime / IterationPerStep; - - for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++) - { - // Can Parallel - foreach (IRigidBody2D rigidBody in rigidBodyCollector) - StepRigidBody(rigidBody, intervalDeltaTime); - - // Can Parallel - foreach (ICollider2D collider in colliderCollector) - collider.Recalculate(); - - // Can Parallel - for (int x = 0; x < colliderCollector.Behaviours.Count; x++) - { - ICollider2D? colliderX = colliderCollector.Behaviours[x]; - if (!colliderX.IsActive) - return; - - for (int y = x + 1; y < colliderCollector.Behaviours.Count; y++) - { - ICollider2D? colliderY = colliderCollector.Behaviours[y]; - - if (!colliderY.IsActive) - return; - - if (colliderX.RigidBody2D == colliderY.RigidBody2D) - continue; - - bool bothCollidersAreTriggers = colliderX.IsTrigger && colliderX.IsTrigger == colliderY.IsTrigger; - if (bothCollidersAreTriggers) - continue; - - bool bothCollidersAreStatic = (colliderX.RigidBody2D?.IsStatic ?? true) && (colliderY.RigidBody2D?.IsStatic ?? true); - if (bothCollidersAreStatic) - continue; - - if (collisionDetector.TryDetect(colliderX, colliderY, out CollisionDetectionInformation information)) - { - if (colliderX.IsTrigger) - { - colliderX.Trigger(colliderY); - continue; - } - else if (colliderY.IsTrigger) - { - colliderY.Trigger(colliderX); - continue; - } - - if (information.Detector == colliderX) - { - colliderX.Detect(information); - colliderY.Detect(information.Reverse()); - } - else - { - colliderX.Detect(information.Reverse()); - colliderY.Detect(information); - } - - collisionResolver?.Resolve(information); - } - } - } - - OnPhysicsIteration?.Invoke(this, intervalDeltaTime); - } - - foreach (IPhysicsUpdate physicsUpdate in physicsUpdateCollector) - physicsUpdate.PhysicsUpdate(deltaTime); - - OnPhysicsStep?.Invoke(this, deltaTime); - } - - private static void StepRigidBody(IRigidBody2D rigidBody, float intervalDeltaTime) - { - if (rigidBody.IsStatic || !rigidBody.IsActive) - return; - - rigidBody.Transform.Position += rigidBody.Velocity * intervalDeltaTime; - rigidBody.Transform.Rotation += rigidBody.AngularVelocity * intervalDeltaTime; - } - protected override void OnEnteringHierarchy(IGameManager gameManager) - { - physicsUpdateCollector.Assign(gameManager); - colliderCollector.Assign(gameManager); - rigidBodyCollector.Assign(gameManager); - } - - protected override void OnExitingHierarchy(IGameManager gameManager) - { - physicsUpdateCollector.Unassign(); - colliderCollector.Unassign(); - rigidBodyCollector.Unassign(); - } - - public PhysicsEngine2DCollector() - { - collisionDetector = new CollisionDetector2D(); - collisionResolver = new CollisionResolver2D(); - } - - public PhysicsEngine2DCollector(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver) - { - this.collisionDetector = collisionDetector; - this.collisionResolver = collisionResolver; - } -}