From 0ba8927858a4f43ce59ddd5917fb65d469786e5d Mon Sep 17 00:00:00 2001 From: Syntriax Date: Thu, 25 Jan 2024 22:00:49 +0300 Subject: [PATCH] perf: Collider2DBase NeedsRecalculation Field --- Engine.Physics2D/Collider2DBehaviourBase.cs | 21 ++++++++++++++++--- Engine.Physics2D/Collider2DCircleBehaviour.cs | 2 +- Engine.Physics2D/Collider2DShapeBehaviour.cs | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Engine.Physics2D/Collider2DBehaviourBase.cs b/Engine.Physics2D/Collider2DBehaviourBase.cs index 4dea627..93becf7 100644 --- a/Engine.Physics2D/Collider2DBehaviourBase.cs +++ b/Engine.Physics2D/Collider2DBehaviourBase.cs @@ -12,16 +12,25 @@ public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D public Action? OnCollisionResolved { get; set; } = null; + protected bool NeedsRecalculation { get; private set; } = true; protected IRigidBody2D? _rigidBody2D = null; - public IRigidBody2D? RigidBody2D => _rigidBody2D; ITransform IAssignableTransform.Transform => Transform; Action? IAssignableTransform.OnTransformAssigned { get => GameObject.OnTransformAssigned; set => GameObject.OnTransformAssigned = value; } bool IAssignableTransform.Assign(ITransform transform) => GameObject.Assign(transform); - public abstract void Recalculate(); + public void Recalculate() + { + if (!NeedsRecalculation) + return; + + CalculateCollider(); + NeedsRecalculation = false; + } + + public abstract void CalculateCollider(); protected override void OnInitialize() { @@ -29,6 +38,8 @@ public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D BehaviourController.OnBehaviourAdded += OnBehaviourAddedToController; BehaviourController.OnBehaviourRemoved += OnBehaviourRemovedFromController; + + Transform.OnPositionChanged += OnPositionChanged; } private void OnBehaviourAddedToController(IBehaviourController _, IBehaviour behaviour) @@ -43,9 +54,13 @@ public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D _rigidBody2D = null; } + private void OnPositionChanged(ITransform transform) => NeedsRecalculation = true; + protected override void OnFinalize() { BehaviourController.OnBehaviourAdded -= OnBehaviourAddedToController; - BehaviourController.OnBehaviourRemoved -= OnBehaviourRemovedFromController; ; + BehaviourController.OnBehaviourRemoved -= OnBehaviourRemovedFromController; + + Transform.OnPositionChanged -= OnPositionChanged; } } diff --git a/Engine.Physics2D/Collider2DCircleBehaviour.cs b/Engine.Physics2D/Collider2DCircleBehaviour.cs index 9d79fad..38991c5 100644 --- a/Engine.Physics2D/Collider2DCircleBehaviour.cs +++ b/Engine.Physics2D/Collider2DCircleBehaviour.cs @@ -10,5 +10,5 @@ public class Collider2DCircleBehaviour : Collider2DBehaviourBase, ICircleCollide public Circle CircleLocal { get; set; } = new(Vector2D.Zero, 1f); - public override void Recalculate() => CircleWorld = Transform.TransformCircle(CircleLocal); + public override void CalculateCollider() => CircleWorld = Transform.TransformCircle(CircleLocal); } diff --git a/Engine.Physics2D/Collider2DShapeBehaviour.cs b/Engine.Physics2D/Collider2DShapeBehaviour.cs index d16950b..9a0794c 100644 --- a/Engine.Physics2D/Collider2DShapeBehaviour.cs +++ b/Engine.Physics2D/Collider2DShapeBehaviour.cs @@ -10,5 +10,5 @@ public class Collider2DShapeBehaviour : Collider2DBehaviourBase, IShapeCollider2 protected Shape _shapeWorld = new([new(1f, 1f), new(-1f, 1f), new(-1f, -1f), new(1f, -1f)]); - public override void Recalculate() => Transform.TransformShape(ShapeLocal, ref _shapeWorld); + public override void CalculateCollider() => Transform.TransformShape(ShapeLocal, ref _shapeWorld); }