From 7b44075ac89f85e447a088180878b5d7414a5c82 Mon Sep 17 00:00:00 2001 From: Wiktor Kocielski Date: Fri, 4 Aug 2023 09:59:45 +0300 Subject: [PATCH] Add recursive methods for layers --- Source/Engine/Level/Actor.cpp | 24 ++++++++++++++++++++++++ Source/Engine/Level/Actor.h | 11 +++++++++++ 2 files changed, 35 insertions(+) diff --git a/Source/Engine/Level/Actor.cpp b/Source/Engine/Level/Actor.cpp index 8185f3b9d..a0aa01cba 100644 --- a/Source/Engine/Level/Actor.cpp +++ b/Source/Engine/Level/Actor.cpp @@ -456,6 +456,19 @@ void Actor::SetLayerName(const StringView& value) LOG(Warning, "Unknown layer name '{0}'", value); } +void Actor::SetLayerNameRecursive(const StringView& value) +{ + for (int32 i = 0; i < 32; i++) + { + if (Level::Layers[i] == value) + { + SetLayerRecursive(i); + return; + } + } + LOG(Warning, "Unknown layer name '{0}'", value); +} + bool Actor::HasTag() const { return Tags.Count() != 0; @@ -500,6 +513,17 @@ void Actor::SetLayer(int32 layerIndex) OnLayerChanged(); } +void Actor::SetLayerRecursive(int32 layerIndex) +{ + layerIndex = Math::Clamp(layerIndex, 0, 31); + for (const auto& child : Children) + child->SetLayerRecursive(layerIndex); + if (layerIndex == _layer) + return; + _layer = layerIndex; + OnLayerChanged(); +} + void Actor::SetName(const StringView& value) { if (_name == value) diff --git a/Source/Engine/Level/Actor.h b/Source/Engine/Level/Actor.h index 510bc9eb8..7a75b12f7 100644 --- a/Source/Engine/Level/Actor.h +++ b/Source/Engine/Level/Actor.h @@ -102,6 +102,12 @@ public: /// The index of the layer. API_PROPERTY() void SetLayer(int32 layerIndex); + /// + /// Sets the layer recursively for all underlying children. + /// + /// The index of the layer. + API_FUNCTION() void SetLayerRecursive(int32 layerIndex); + /// /// Gets the name of the layer. /// @@ -113,6 +119,11 @@ public: /// API_PROPERTY() void SetLayerName(const StringView& value); + /// + /// Sets the name of the layer recursively for all underlying children. + /// + API_FUNCTION() void SetLayerNameRecursive(const StringView& value); + /// /// Determines whether this actor has any tag assigned. ///