Amend Me
This commit is contained in:
@@ -4,13 +4,30 @@ namespace Syntriax.Engine.Physics2D;
|
||||
|
||||
public abstract class Collider2DBehaviourBase : Behaviour2D, ICollider2D
|
||||
{
|
||||
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();
|
||||
public Event<ICollider2D, CollisionDetectionInformation> OnCollisionDetected { get; init; } = new();
|
||||
public Event<ICollider2D, CollisionDetectionInformation> OnCollisionResolved { get; init; } = new();
|
||||
public Event<ICollider2D, ICollider2D> OnTriggered { get; init; } = new();
|
||||
|
||||
private readonly Event<IBehaviourController, IBehaviourController.BehaviourAddedArguments>.EventHandler cachedOnBehaviourAddedToController = null!;
|
||||
private readonly Event<IBehaviourController, IBehaviourController.BehaviourRemovedArguments>.EventHandler cachedOnBehaviourRemovedFromController = null!;
|
||||
private readonly Event<ITransform2D, ITransform2D.PositionChangedArguments>.EventHandler cachedSetNeedsRecalculationFromPosition = null!;
|
||||
private readonly Event<ITransform2D, ITransform2D.RotationChangedArguments>.EventHandler cachedSetNeedsRecalculationFromRotation = null!;
|
||||
private readonly Event<ITransform2D, ITransform2D.ScaleChangedArguments>.EventHandler cachedSetNeedsRecalculationFromScale = null!;
|
||||
private readonly Event<IUniverseObject, IUniverseObject.ParentChangedArguments>.EventHandler cachedUpdateRigidBody2D = null!;
|
||||
|
||||
protected bool NeedsRecalculation { get; set; } = true;
|
||||
protected IRigidBody2D? _rigidBody2D = null;
|
||||
|
||||
protected Collider2DBehaviourBase()
|
||||
{
|
||||
cachedOnBehaviourAddedToController = OnBehaviourAddedToController;
|
||||
cachedOnBehaviourRemovedFromController = OnBehaviourRemovedFromController;
|
||||
cachedSetNeedsRecalculationFromPosition = SetNeedsRecalculationFromPosition;
|
||||
cachedSetNeedsRecalculationFromRotation = SetNeedsRecalculationFromRotation;
|
||||
cachedSetNeedsRecalculationFromScale = SetNeedsRecalculationFromScale;
|
||||
cachedUpdateRigidBody2D = UpdateRigidBody2D;
|
||||
}
|
||||
|
||||
public IRigidBody2D? RigidBody2D => _rigidBody2D;
|
||||
public bool IsTrigger { get; set; } = false;
|
||||
|
||||
@@ -29,44 +46,44 @@ public abstract class Collider2DBehaviourBase : Behaviour2D, ICollider2D
|
||||
{
|
||||
BehaviourController.TryGetBehaviourInParent(out _rigidBody2D);
|
||||
|
||||
BehaviourController.OnBehaviourAdded.AddListener(OnBehaviourAddedToController);
|
||||
BehaviourController.OnBehaviourRemoved.AddListener(OnBehaviourRemovedFromController);
|
||||
BehaviourController.OnBehaviourAdded.AddListener(cachedOnBehaviourAddedToController);
|
||||
BehaviourController.OnBehaviourRemoved.AddListener(cachedOnBehaviourRemovedFromController);
|
||||
|
||||
Transform.OnPositionChanged.AddListener(SetNeedsRecalculationFromPosition);
|
||||
Transform.OnRotationChanged.AddListener(SetNeedsRecalculationFromRotation);
|
||||
Transform.OnScaleChanged.AddListener(SetNeedsRecalculationFromScale);
|
||||
UniverseObject.OnParentChanged.AddListener(UpdateRigidBody2D);
|
||||
Transform.OnPositionChanged.AddListener(cachedSetNeedsRecalculationFromPosition);
|
||||
Transform.OnRotationChanged.AddListener(cachedSetNeedsRecalculationFromRotation);
|
||||
Transform.OnScaleChanged.AddListener(cachedSetNeedsRecalculationFromScale);
|
||||
UniverseObject.OnParentChanged.AddListener(cachedUpdateRigidBody2D);
|
||||
}
|
||||
|
||||
private void UpdateRigidBody2D(IUniverseObject sender, IUniverseObject? previousParent, IUniverseObject? newParent)
|
||||
private void UpdateRigidBody2D(IUniverseObject sender, IUniverseObject.ParentChangedArguments arguments)
|
||||
{
|
||||
BehaviourController.TryGetBehaviourInParent(out _rigidBody2D);
|
||||
}
|
||||
|
||||
private void OnBehaviourAddedToController(IBehaviourController _, IBehaviour behaviour)
|
||||
private void OnBehaviourAddedToController(IBehaviourController sender, IBehaviourController.BehaviourAddedArguments arguments)
|
||||
{
|
||||
if (behaviour is IRigidBody2D rigidBody)
|
||||
if (arguments.BehaviourAdded is IRigidBody2D rigidBody)
|
||||
_rigidBody2D = rigidBody;
|
||||
}
|
||||
|
||||
private void OnBehaviourRemovedFromController(IBehaviourController _, IBehaviour behaviour)
|
||||
private void OnBehaviourRemovedFromController(IBehaviourController sender, IBehaviourController.BehaviourRemovedArguments arguments)
|
||||
{
|
||||
if (behaviour is IRigidBody2D _)
|
||||
if (arguments.BehaviourRemoved is IRigidBody2D)
|
||||
_rigidBody2D = null;
|
||||
}
|
||||
|
||||
private void SetNeedsRecalculationFromScale(ITransform2D sender, Vector2D previousScale) => NeedsRecalculation = true;
|
||||
private void SetNeedsRecalculationFromPosition(ITransform2D sender, Vector2D previousPosition) => NeedsRecalculation = true;
|
||||
private void SetNeedsRecalculationFromRotation(ITransform2D sender, float previousRotation) => NeedsRecalculation = true;
|
||||
private void SetNeedsRecalculationFromPosition(ITransform2D sender, ITransform2D.PositionChangedArguments arguments) => NeedsRecalculation = true;
|
||||
private void SetNeedsRecalculationFromScale(ITransform2D sender, ITransform2D.ScaleChangedArguments arguments) => NeedsRecalculation = true;
|
||||
private void SetNeedsRecalculationFromRotation(ITransform2D sender, ITransform2D.RotationChangedArguments arguments) => NeedsRecalculation = true;
|
||||
|
||||
protected override void OnFinalize()
|
||||
{
|
||||
BehaviourController.OnBehaviourAdded.RemoveListener(OnBehaviourAddedToController);
|
||||
BehaviourController.OnBehaviourRemoved.RemoveListener(OnBehaviourRemovedFromController);
|
||||
Transform.OnScaleChanged.RemoveListener(SetNeedsRecalculationFromScale);
|
||||
BehaviourController.OnBehaviourAdded.RemoveListener(cachedOnBehaviourAddedToController);
|
||||
BehaviourController.OnBehaviourRemoved.RemoveListener(cachedOnBehaviourRemovedFromController);
|
||||
Transform.OnScaleChanged.RemoveListener(cachedSetNeedsRecalculationFromScale);
|
||||
|
||||
Transform.OnPositionChanged.RemoveListener(SetNeedsRecalculationFromPosition);
|
||||
Transform.OnRotationChanged.RemoveListener(SetNeedsRecalculationFromRotation);
|
||||
Transform.OnPositionChanged.RemoveListener(cachedSetNeedsRecalculationFromPosition);
|
||||
Transform.OnRotationChanged.RemoveListener(cachedSetNeedsRecalculationFromRotation);
|
||||
}
|
||||
|
||||
public void Detect(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionDetected?.Invoke(this, collisionDetectionInformation);
|
||||
|
||||
Reference in New Issue
Block a user