|
|
|
|
@ -373,17 +373,25 @@ namespace AzToolsFramework
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetConstNestedEntities(const AZStd::function<bool(const AZ::Entity&)>& callback)
|
|
|
|
|
bool Instance::GetEntities_Impl(const AZStd::function<bool(AZStd::unique_ptr<AZ::Entity>&)>& callback)
|
|
|
|
|
{
|
|
|
|
|
GetConstEntities(callback);
|
|
|
|
|
|
|
|
|
|
for (const auto& [instanceAlias, instance] : m_nestedInstances)
|
|
|
|
|
for (auto& [entityAlias, entity] : m_entities)
|
|
|
|
|
{
|
|
|
|
|
instance->GetConstNestedEntities(callback);
|
|
|
|
|
if (!entity)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!callback(entity))
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetConstEntities(const AZStd::function<bool(const AZ::Entity&)>& callback)
|
|
|
|
|
bool Instance::GetConstEntities_Impl(const AZStd::function<bool(const AZ::Entity&)>& callback) const
|
|
|
|
|
{
|
|
|
|
|
for (const auto& [entityAlias, entity] : m_entities)
|
|
|
|
|
{
|
|
|
|
|
@ -394,65 +402,91 @@ namespace AzToolsFramework
|
|
|
|
|
|
|
|
|
|
if (!callback(*entity))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetNestedEntities(const AZStd::function<bool(AZStd::unique_ptr<AZ::Entity>&)>& callback)
|
|
|
|
|
bool Instance::GetAllEntitiesInHierarchy_Impl(const AZStd::function<bool(AZStd::unique_ptr<AZ::Entity>&)>& callback)
|
|
|
|
|
{
|
|
|
|
|
GetEntities(callback);
|
|
|
|
|
|
|
|
|
|
for (auto& [instanceAlias, instance] : m_nestedInstances)
|
|
|
|
|
if (HasContainerEntity())
|
|
|
|
|
{
|
|
|
|
|
instance->GetNestedEntities(callback);
|
|
|
|
|
if (!callback(m_containerEntity))
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetNestedInstances(const AZStd::function<void(AZStd::unique_ptr<Instance>&)>& callback)
|
|
|
|
|
{
|
|
|
|
|
for (auto& [instanceAlias, instance] : m_nestedInstances)
|
|
|
|
|
if (!GetEntities_Impl(callback))
|
|
|
|
|
{
|
|
|
|
|
callback(instance);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetEntities(const AZStd::function<bool(AZStd::unique_ptr<AZ::Entity>&)>& callback)
|
|
|
|
|
{
|
|
|
|
|
for (auto& [entityAlias, entity] : m_entities)
|
|
|
|
|
for (auto& [instanceAlias, instance] : m_nestedInstances)
|
|
|
|
|
{
|
|
|
|
|
if (!callback(entity))
|
|
|
|
|
if (!instance->GetAllEntitiesInHierarchy_Impl(callback))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetEntities(EntityList& entities, bool includeNestedEntities)
|
|
|
|
|
bool Instance::GetAllEntitiesInHierarchyConst_Impl(const AZStd::function<bool(const AZ::Entity&)>& callback) const
|
|
|
|
|
{
|
|
|
|
|
// Non-recursive traversal of instances
|
|
|
|
|
AZStd::vector<Instance*> instancesToTraverse = { this };
|
|
|
|
|
while (!instancesToTraverse.empty())
|
|
|
|
|
if (HasContainerEntity())
|
|
|
|
|
{
|
|
|
|
|
Instance* currentInstance = instancesToTraverse.back();
|
|
|
|
|
instancesToTraverse.pop_back();
|
|
|
|
|
if (includeNestedEntities)
|
|
|
|
|
if (!callback(*m_containerEntity))
|
|
|
|
|
{
|
|
|
|
|
instancesToTraverse.reserve(instancesToTraverse.size() + currentInstance->m_nestedInstances.size());
|
|
|
|
|
for (const auto& instanceByAlias : currentInstance->m_nestedInstances)
|
|
|
|
|
{
|
|
|
|
|
instancesToTraverse.push_back(instanceByAlias.second.get());
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Size increases by 1 for each instance because we have to count the container entity also.
|
|
|
|
|
entities.reserve(entities.size() + currentInstance->m_entities.size() + 1);
|
|
|
|
|
entities.push_back(m_containerEntity.get());
|
|
|
|
|
for (const auto& entityByAlias : currentInstance->m_entities)
|
|
|
|
|
if (!GetConstEntities_Impl(callback))
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const auto& [instanceAlias, instance] : m_nestedInstances)
|
|
|
|
|
{
|
|
|
|
|
if (!instance->GetAllEntitiesInHierarchyConst_Impl(callback))
|
|
|
|
|
{
|
|
|
|
|
entities.push_back(entityByAlias.second.get());
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetEntities(const AZStd::function<bool(AZStd::unique_ptr<AZ::Entity>&)>& callback)
|
|
|
|
|
{
|
|
|
|
|
GetEntities_Impl(callback);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetConstEntities(const AZStd::function<bool(const AZ::Entity&)>& callback) const
|
|
|
|
|
{
|
|
|
|
|
GetConstEntities_Impl(callback);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetAllEntitiesInHierarchy(const AZStd::function<bool(AZStd::unique_ptr<AZ::Entity>&)>& callback)
|
|
|
|
|
{
|
|
|
|
|
GetAllEntitiesInHierarchy_Impl(callback);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetAllEntitiesInHierarchyConst(const AZStd::function<bool(const AZ::Entity&)>& callback) const
|
|
|
|
|
{
|
|
|
|
|
GetAllEntitiesInHierarchyConst_Impl(callback);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Instance::GetNestedInstances(const AZStd::function<void(AZStd::unique_ptr<Instance>&)>& callback)
|
|
|
|
|
{
|
|
|
|
|
for (auto& [instanceAlias, instance] : m_nestedInstances)
|
|
|
|
|
{
|
|
|
|
|
callback(instance);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EntityAliasOptionalReference Instance::GetEntityAlias(const AZ::EntityId& id)
|
|
|
|
|
|