using Syntriax.Engine.Core; using Syntriax.Engine.Core.Abstract; using Syntriax.Engine.Physics2D.Abstract; namespace Syntriax.Engine.Physics2D; public abstract class Collider2DBehaviourBase : Behaviour, ICollider2D { public event ICollider2D.OnCollisionDetectedEventHandler? OnCollisionDetected = null; public event ICollider2D.OnCollisionResolvedEventHandler? OnCollisionResolved = null; public event ICollider2D.OnTriggeredEventHandler? OnTriggered = null; protected bool NeedsRecalculation { get; private set; } = true; protected IRigidBody2D? _rigidBody2D = null; public IRigidBody2D? RigidBody2D => _rigidBody2D; public bool IsTrigger { get; set; } = false; ITransform IAssignableTransform.Transform => Transform; public event IAssignableTransform.OnTransformAssignedEventHandler? OnTransformAssigned { add => GameObject.OnTransformAssigned += value; remove => GameObject.OnTransformAssigned -= value; } bool IAssignableTransform.Assign(ITransform transform) => GameObject.Assign(transform); public void Recalculate() { if (!NeedsRecalculation) return; CalculateCollider(); NeedsRecalculation = false; } public abstract void CalculateCollider(); protected override void OnInitialize() { BehaviourController.TryGetBehaviourInParent(out _rigidBody2D); BehaviourController.OnBehaviourAdded += OnBehaviourAddedToController; BehaviourController.OnBehaviourRemoved += OnBehaviourRemovedFromController; Transform.OnPositionChanged += SetNeedsRecalculation; Transform.OnRotationChanged += SetNeedsRecalculation; Transform.OnScaleChanged += SetNeedsRecalculation; Transform.OnParentChanged += UpdateRigidBody2D; } private void UpdateRigidBody2D(ITransform sender, ITransform? previousParent, ITransform? newParent) { BehaviourController.TryGetBehaviourInParent(out _rigidBody2D); } private void OnBehaviourAddedToController(IBehaviourController _, IBehaviour behaviour) { if (behaviour is IRigidBody2D rigidBody) _rigidBody2D = rigidBody; } private void OnBehaviourRemovedFromController(IBehaviourController _, IBehaviour behaviour) { if (behaviour is IRigidBody2D _) _rigidBody2D = null; } private void SetNeedsRecalculation(ITransform transform) => NeedsRecalculation = true; protected override void OnFinalize() { BehaviourController.OnBehaviourAdded -= OnBehaviourAddedToController; BehaviourController.OnBehaviourRemoved -= OnBehaviourRemovedFromController; Transform.OnScaleChanged -= SetNeedsRecalculation; Transform.OnPositionChanged -= SetNeedsRecalculation; Transform.OnRotationChanged -= SetNeedsRecalculation; } public void Detect(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionDetected?.Invoke(this, collisionDetectionInformation); public void Resolve(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionResolved?.Invoke(this, collisionDetectionInformation); public void Trigger(ICollider2D initiator) => OnTriggered?.Invoke(this, initiator); }