diff --git a/Source/Engine/Level/Actor.cpp b/Source/Engine/Level/Actor.cpp index a9d136b30..394d5c9dc 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; @@ -476,6 +489,13 @@ void Actor::AddTag(const Tag& tag) Tags.AddUnique(tag); } +void Actor::AddTagRecursive(const Tag& tag) +{ + for (const auto& child : Children) + child->AddTagRecursive(tag); + Tags.AddUnique(tag); +} + void Actor::RemoveTag(const Tag& tag) { Tags.Remove(tag); @@ -505,6 +525,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 8643dba05..5d66e7a16 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 actor and for all underlying child actors. + /// + API_FUNCTION() void SetLayerNameRecursive(const StringView& value); + /// /// Determines whether this actor has any tag assigned. /// @@ -137,6 +148,11 @@ public: API_FUNCTION() void AddTag(const Tag& tag); /// + /// Adds a tag to the actor and for all underlying child actors. + /// + /// The tag to add. + API_FUNCTION() void AddTagRecursive(const Tag& tag); + /// Removes a tag to the actor /// /// The tag to remove.