diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index ae617b980..ab8a9bbfe 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -740,16 +740,20 @@ Actor* FindActorRecursive(Actor* node, const Tag& tag) return result; } -void FindActorsRecursive(Actor* node, const Tag& tag, Array& result) +void FindActorsRecursive(Actor* node, const Tag& tag, const bool activeOnly, Array& result) { + if (activeOnly && !node->GetIsActive()) + return; if (node->HasTag(tag)) result.Add(node); for (Actor* child : node->Children) - FindActorsRecursive(child, tag, result); + FindActorsRecursive(child, tag, activeOnly, result); } -void FindActorsRecursiveByParentTags(Actor* node, const Array& tags, Array& result) +void FindActorsRecursiveByParentTags(Actor* node, const Array& tags, const bool activeOnly, Array& result) { + if (activeOnly && !node->GetIsActive()) + return; for (Tag tag : tags) { if (node->HasTag(tag)) @@ -759,7 +763,7 @@ void FindActorsRecursiveByParentTags(Actor* node, const Array& tags, Array< } } for (Actor* child : node->Children) - FindActorsRecursiveByParentTags(child, tags, result); + FindActorsRecursiveByParentTags(child, tags, activeOnly, result); } Actor* Level::FindActor(const Tag& tag, Actor* root) @@ -785,24 +789,24 @@ void FindActorRecursive(Actor* node, const Tag& tag, Array& result) FindActorRecursive(child, tag, result); } -Array Level::FindActors(const Tag& tag, Actor* root) +Array Level::FindActors(const Tag& tag, const bool activeOnly, Actor* root) { PROFILE_CPU(); Array result; if (root) { - FindActorsRecursive(root, tag, result); + FindActorsRecursive(root, tag, activeOnly, result); } else { ScopeLock lock(ScenesLock); for (Scene* scene : Scenes) - FindActorsRecursive(scene, tag, result); + FindActorsRecursive(scene, tag, activeOnly, result); } return result; } -Array Level::FindActorsByParentTag(const Tag& parentTag, Actor* root) +Array Level::FindActorsByParentTag(const Tag& parentTag, const bool activeOnly, Actor* root) { PROFILE_CPU(); Array result; @@ -814,19 +818,19 @@ Array Level::FindActorsByParentTag(const Tag& parentTag, Actor* root) } if (subTags.Count() == 1) { - result = FindActors(subTags[0], root); + result = FindActors(subTags[0], activeOnly, root); return result; } if (root) { - FindActorsRecursiveByParentTags(root, subTags, result); + FindActorsRecursiveByParentTags(root, subTags, activeOnly, result); } else { ScopeLock lock(ScenesLock); for (Scene* scene : Scenes) - FindActorsRecursiveByParentTags(scene, subTags, result); + FindActorsRecursiveByParentTags(scene, subTags, activeOnly, result); } return result; diff --git a/Source/Engine/Level/Level.h b/Source/Engine/Level/Level.h index e27b81bb9..9a041bda9 100644 --- a/Source/Engine/Level/Level.h +++ b/Source/Engine/Level/Level.h @@ -494,17 +494,19 @@ public: /// Tries to find the actors with the given tag (returns all found). /// /// The tag of the actor to search for. + /// Find only active actors. /// The custom root actor to start searching from (hierarchical), otherwise null to search all loaded scenes. /// Found actors or empty if none. - API_FUNCTION() static Array FindActors(const Tag& tag, Actor* root = nullptr); + API_FUNCTION() static Array FindActors(const Tag& tag, const bool activeOnly = false, Actor* root = nullptr); /// /// Search actors using a parent parentTag. /// /// The tag to search actors with subtags belonging to this tag + /// Find only active actors. /// The custom root actor to start searching from (hierarchical), otherwise null to search all loaded scenes. /// Returns all actors that have subtags belonging to the given parent parentTag - API_FUNCTION() static Array FindActorsByParentTag(const Tag& parentTag, Actor* root = nullptr); + API_FUNCTION() static Array FindActorsByParentTag(const Tag& parentTag, const bool activeOnly = false, Actor* root = nullptr); private: // Actor API