From 3902f1caca2c7f3f8b69b1ba7239c5cc2dff5af5 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Tue, 6 Feb 2024 12:15:45 +0300 Subject: [PATCH] feat: Parent Change Propagation to Children --- Engine.Core/Transform.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Engine.Core/Transform.cs b/Engine.Core/Transform.cs index 6007b34..394c788 100644 --- a/Engine.Core/Transform.cs +++ b/Engine.Core/Transform.cs @@ -133,6 +133,7 @@ public class Transform : ITransform Parent.OnPositionChanged -= RecalculatePosition; Parent.OnScaleChanged -= RecalculateScale; Parent.OnRotationChanged -= RecalculateRotation; + Parent.OnParentChanged -= NotifyChildrenOnParentChange; } Parent = transform; @@ -143,6 +144,7 @@ public class Transform : ITransform transform.OnPositionChanged += RecalculatePosition; transform.OnScaleChanged += RecalculateScale; transform.OnRotationChanged += RecalculateRotation; + transform.OnParentChanged += NotifyChildrenOnParentChange; } UpdateLocalPosition(); @@ -174,6 +176,14 @@ public class Transform : ITransform public IEnumerator GetEnumerator() => _children.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => _children.GetEnumerator(); + private void NotifyChildrenOnParentChange(ITransform transform, ITransform? previousParent) + { + // TODO No idea how logical this is to propagate this to the children the way I'm doing right now. + // I was originally gonna just call `child.OnParentChanged?.Invoke(child, child.Parent);` but seems an unnecessary call too? + foreach (var child in Children) + child.OnParentChanged?.Invoke(transform, previousParent); + } + private void RecalculatePosition(ITransform _) { if (Parent is null)