perf: regular events to custom events

This commit is contained in:
2025-05-30 12:58:08 +03:00
parent b1b5af94d3
commit 846aa75dd5
42 changed files with 342 additions and 198 deletions

View File

@@ -10,17 +10,17 @@ public interface ICollider2D : IBehaviour
/// <summary>
/// Event triggered when a collision is detected.
/// </summary>
event CollisionDetectedEventHandler? OnCollisionDetected;
Event<ICollider2D, CollisionDetectionInformation> OnCollisionDetected { get; }
/// <summary>
/// Event triggered when a collision is resolved.
/// </summary>
event CollisionResolvedEventHandler? OnCollisionResolved;
Event<ICollider2D, CollisionDetectionInformation> OnCollisionResolved { get; }
/// <summary>
/// Event triggered when another <see cref="ICollider2D"/> triggers this <see cref="ICollider2D"/>.
/// </summary>
event TriggeredEventHandler? OnTriggered;
Event<ICollider2D, ICollider2D> OnTriggered { get; }
/// <inheritdoc cref="ITransform2D" />
ITransform2D Transform { get; }

View File

@@ -1,3 +1,5 @@
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Physics2D;
/// <summary>
@@ -8,12 +10,12 @@ public interface IPhysicsEngine2D
/// <summary>
/// Event triggered when the <see cref="IPhysicsEngine2D"/> has done a single physics iteration.
/// </summary>
event PhysicsIterationEventHandler? OnPhysicsIteration;
Event<IPhysicsEngine2D, float> OnPhysicsIteration { get; }
/// <summary>
/// Event triggered when the <see cref="IPhysicsEngine2D"/> has done a full physics step/>.
/// </summary>
event PhysicsStepEventHandler? OnPhysicsStep;
Event<IPhysicsEngine2D, float> OnPhysicsStep { get; }
/// <summary>
/// The number of iterations the <see cref="IPhysicsEngine2D"/> performs per step.

View File

@@ -4,9 +4,9 @@ namespace Syntriax.Engine.Physics2D;
public abstract class Collider2DBehaviourBase : Behaviour2D, ICollider2D
{
public event ICollider2D.CollisionDetectedEventHandler? OnCollisionDetected = null;
public event ICollider2D.CollisionResolvedEventHandler? OnCollisionResolved = null;
public event ICollider2D.TriggeredEventHandler? OnTriggered = null;
public Event<ICollider2D, CollisionDetectionInformation> OnCollisionDetected { get; private set; } = new();
public Event<ICollider2D, CollisionDetectionInformation> OnCollisionResolved { get; private set; } = new();
public Event<ICollider2D, ICollider2D> OnTriggered { get; private set; } = new();
protected bool NeedsRecalculation { get; set; } = true;
protected IRigidBody2D? _rigidBody2D = null;
@@ -29,13 +29,13 @@ public abstract class Collider2DBehaviourBase : Behaviour2D, ICollider2D
{
BehaviourController.TryGetBehaviourInParent(out _rigidBody2D);
BehaviourController.OnBehaviourAdded += OnBehaviourAddedToController;
BehaviourController.OnBehaviourRemoved += OnBehaviourRemovedFromController;
BehaviourController.OnBehaviourAdded.AddListener(OnBehaviourAddedToController);
BehaviourController.OnBehaviourRemoved.AddListener(OnBehaviourRemovedFromController);
Transform.OnPositionChanged += SetNeedsRecalculationFromPosition;
Transform.OnRotationChanged += SetNeedsRecalculationFromRotation;
Transform.OnScaleChanged += SetNeedsRecalculationFromScale;
UniverseObject.OnParentChanged += UpdateRigidBody2D;
Transform.OnPositionChanged.AddListener(SetNeedsRecalculationFromPosition);
Transform.OnRotationChanged.AddListener(SetNeedsRecalculationFromRotation);
Transform.OnScaleChanged.AddListener(SetNeedsRecalculationFromScale);
UniverseObject.OnParentChanged.AddListener(UpdateRigidBody2D);
}
private void UpdateRigidBody2D(IUniverseObject sender, IUniverseObject? previousParent, IUniverseObject? newParent)
@@ -61,12 +61,12 @@ public abstract class Collider2DBehaviourBase : Behaviour2D, ICollider2D
protected override void OnFinalize()
{
BehaviourController.OnBehaviourAdded -= OnBehaviourAddedToController;
BehaviourController.OnBehaviourRemoved -= OnBehaviourRemovedFromController;
Transform.OnScaleChanged -= SetNeedsRecalculationFromScale;
BehaviourController.OnBehaviourAdded.RemoveListener(OnBehaviourAddedToController);
BehaviourController.OnBehaviourRemoved.RemoveListener(OnBehaviourRemovedFromController);
Transform.OnScaleChanged.RemoveListener(SetNeedsRecalculationFromScale);
Transform.OnPositionChanged -= SetNeedsRecalculationFromPosition;
Transform.OnRotationChanged -= SetNeedsRecalculationFromRotation;
Transform.OnPositionChanged.RemoveListener(SetNeedsRecalculationFromPosition);
Transform.OnRotationChanged.RemoveListener(SetNeedsRecalculationFromRotation);
}
public void Detect(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionDetected?.Invoke(this, collisionDetectionInformation);

View File

@@ -25,9 +25,9 @@ public class PhysicsCoroutineManager : UniverseObject
{
physicsEngine = universe.GetUniverseObject<IPhysicsEngine2D>();
if (physicsEngine is IPhysicsEngine2D foundPhysicsEngine)
foundPhysicsEngine.OnPhysicsStep += OnPhysicsStep;
foundPhysicsEngine.OnPhysicsStep.RemoveListener(OnPhysicsStep);
else
universe.OnUpdate += OnUpdate;
universe.OnUpdate.AddListener(OnUpdate);
}
private void OnPhysicsStep(IPhysicsEngine2D sender, float stepDeltaTime)
@@ -45,8 +45,8 @@ public class PhysicsCoroutineManager : UniverseObject
protected override void OnExitingUniverse(IUniverse universe)
{
if (physicsEngine is IPhysicsEngine2D existingPhysicsEngine)
existingPhysicsEngine.OnPhysicsStep -= OnPhysicsStep;
universe.OnUpdate -= OnUpdate;
existingPhysicsEngine.OnPhysicsStep.RemoveListener(OnPhysicsStep);
universe.OnUpdate.RemoveListener(OnUpdate);
}
private void OnUpdate(IUniverse sender, UniverseTime engineTime)
@@ -57,8 +57,8 @@ public class PhysicsCoroutineManager : UniverseObject
physicsEngine = universe.GetUniverseObject<IPhysicsEngine2D>();
if (physicsEngine is IPhysicsEngine2D foundPhysicsEngine)
{
foundPhysicsEngine.OnPhysicsStep += OnPhysicsStep;
universe.OnUpdate -= OnUpdate;
foundPhysicsEngine.OnPhysicsStep.AddListener(OnPhysicsStep);
universe.OnUpdate.RemoveListener(OnUpdate);
}
}
}

View File

@@ -4,8 +4,8 @@ namespace Syntriax.Engine.Physics2D;
public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D
{
public event IPhysicsEngine2D.PhysicsIterationEventHandler? OnPhysicsIteration = null;
public event IPhysicsEngine2D.PhysicsStepEventHandler? OnPhysicsStep = null;
public Event<IPhysicsEngine2D, float> OnPhysicsIteration { get; private set; } = new();
public Event<IPhysicsEngine2D, float> OnPhysicsStep { get; private set; } = new();
private float physicsTicker = 0f;
private int _iterationPerStep = 1;
@@ -178,7 +178,7 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D
colliderCollector.Assign(universe);
rigidBodyCollector.Assign(universe);
universe.OnPreUpdate += OnEnginePreUpdate;
universe.OnPreUpdate.AddListener(OnEnginePreUpdate);
}
protected override void OnExitingUniverse(IUniverse universe)
@@ -189,7 +189,7 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D
colliderCollector.Unassign();
rigidBodyCollector.Unassign();
universe.OnPreUpdate -= OnEnginePreUpdate;
universe.OnPreUpdate.RemoveListener(OnEnginePreUpdate);
}
private void OnEnginePreUpdate(IUniverse sender, UniverseTime engineTime)

View File

@@ -6,8 +6,8 @@ namespace Syntriax.Engine.Physics2D;
public class PhysicsEngine2DStandalone : IPhysicsEngine2D
{
public event IPhysicsEngine2D.PhysicsIterationEventHandler? OnPhysicsIteration = null;
public event IPhysicsEngine2D.PhysicsStepEventHandler? OnPhysicsStep = null;
public Event<IPhysicsEngine2D, float> OnPhysicsIteration { get; private set; } = new();
public Event<IPhysicsEngine2D, float> OnPhysicsStep { get; private set; } = new();
private readonly List<IRigidBody2D> rigidBodies = new(32);
private readonly List<ICollider2D> colliders = new(64);
@@ -29,13 +29,16 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
foreach (ICollider2D collider2D in rigidBody.BehaviourController.GetBehaviours<ICollider2D>())
colliders.Add(collider2D);
rigidBody.BehaviourController.OnBehaviourAdded += OnBehaviourAdded;
rigidBody.BehaviourController.OnBehaviourRemoved += OnBehaviourRemoved;
rigidBody.BehaviourController.OnBehaviourAdded.AddListener(OnBehaviourAdded);
rigidBody.BehaviourController.OnBehaviourRemoved.AddListener(OnBehaviourRemoved);
}
public void RemoveRigidBody(IRigidBody2D rigidBody)
{
rigidBodies.Remove(rigidBody);
rigidBody.BehaviourController.OnBehaviourAdded.RemoveListener(OnBehaviourAdded);
rigidBody.BehaviourController.OnBehaviourRemoved.RemoveListener(OnBehaviourRemoved);
}
public void Step(float deltaTime)