Fix Entity id consistency issue & refactor prefab workflows/tests (#4373)
* Fix Entity id consistency issue & refactor prefab workflows/test framework Signed-off-by: chiyteng <chiyteng@amazon.com> * Update comments Signed-off-by: chiyteng <chiyteng@amazon.com> * Modify CreatePrefab and remove extra spaces Signed-off-by: chiyteng <chiyteng@amazon.com> * Address comments Signed-off-by: chiyteng <chiyteng@amazon.com> * Refactor prefab instance constructors Signed-off-by: chiyteng <chiyteng@amazon.com> * Remove commented out code Signed-off-by: chiyteng <chiyteng@amazon.com>
This commit is contained in:
@@ -25,28 +25,39 @@ import prefab.Prefab_Test_Utils as prefab_test_utils
|
||||
# This is a helper class which contains some of the useful information about a prefab instance.
|
||||
class PrefabInstance:
|
||||
|
||||
def __init__(self, name: str=None, prefab_file_name: str=None, container_entity: EditorEntity=EntityId()):
|
||||
self.name = name
|
||||
def __init__(self, prefab_file_name: str=None, container_entity: EditorEntity=EntityId()):
|
||||
self.prefab_file_name: str = prefab_file_name
|
||||
self.container_entity: EditorEntity = container_entity
|
||||
|
||||
def __eq__(self, other):
|
||||
return other and self.container_entity.id == other.container_entity.id
|
||||
|
||||
def __ne__(self, other):
|
||||
return not self.__eq__(other)
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.container_entity.id)
|
||||
|
||||
"""
|
||||
See if this instance is valid to be used with other prefab operations.
|
||||
:return: Whether the target instance is valid or not.
|
||||
"""
|
||||
def is_valid() -> bool:
|
||||
return self.container_entity.id.IsValid() and self.name is not None and self.prefab_file_name in Prefab.existing_prefabs
|
||||
return self.container_entity.id.IsValid() and self.prefab_file_name in Prefab.existing_prefabs
|
||||
|
||||
|
||||
"""
|
||||
Reparent this instance to target parent entity.
|
||||
The function will also check pop up dialog ui in editor to see if there's prefab cyclical dependency error while reparenting prefabs.
|
||||
:param parent_entity_id: The id of the entity this instance should be a child of in the transform hierarchy next.
|
||||
"""
|
||||
async def ui_reparent_prefab_instance(self, parent_entity_id: EntityId):
|
||||
container_entity_name = self.container_entity.get_name()
|
||||
current_children_entity_ids_having_prefab_name = prefab_test_utils.get_children_ids_by_name(parent_entity_id, container_entity_name)
|
||||
Report.info(f'current_children_entity_ids_having_prefab_name: {current_children_entity_ids_having_prefab_name}')
|
||||
container_entity_id_before_reparent = self.container_entity.id
|
||||
|
||||
original_parent = EditorEntity(self.container_entity.get_parent_id())
|
||||
original_parent_before_reparent_children_ids = set(original_parent.get_children_ids())
|
||||
|
||||
new_parent = EditorEntity(parent_entity_id)
|
||||
new_parent_before_reparent_children_ids = set(new_parent.get_children_ids())
|
||||
|
||||
pyside_utils.run_soon(lambda: self.container_entity.set_parent_entity(parent_entity_id))
|
||||
pyside_utils.run_soon(lambda: prefab_test_utils.wait_for_propagation())
|
||||
@@ -60,18 +71,23 @@ class PrefabInstance:
|
||||
except pyside_utils.EventLoopTimeoutException:
|
||||
pass
|
||||
|
||||
updated_children_entity_ids_having_prefab_name = prefab_test_utils.get_children_ids_by_name(parent_entity_id, container_entity_name)
|
||||
Report.info(f'updated_children_entity_ids_having_prefab_name: {updated_children_entity_ids_having_prefab_name}')
|
||||
new_child_with_reparented_prefab_name_added = len(updated_children_entity_ids_having_prefab_name) == len(current_children_entity_ids_having_prefab_name) + 1
|
||||
assert new_child_with_reparented_prefab_name_added, "No entity with reparented prefab name become a child of target parent entity"
|
||||
original_parent_after_reparent_children_ids = set(original_parent.get_children_ids())
|
||||
assert len(original_parent_after_reparent_children_ids) == len(original_parent_before_reparent_children_ids) - 1, \
|
||||
"The children count of the Prefab Instance's original parent should be decreased by 1."
|
||||
assert not container_entity_id_before_reparent in original_parent_after_reparent_children_ids, \
|
||||
"This Prefab Instance is still a child entity of its original parent entity."
|
||||
|
||||
new_parent_after_reparent_children_ids = set(new_parent.get_children_ids())
|
||||
assert len(new_parent_after_reparent_children_ids) == len(new_parent_before_reparent_children_ids) + 1, \
|
||||
"The children count of the Prefab Instance's new parent should be increased by 1."
|
||||
|
||||
updated_container_entity_id = set(updated_children_entity_ids_having_prefab_name).difference(current_children_entity_ids_having_prefab_name).pop()
|
||||
updated_container_entity = EditorEntity(updated_container_entity_id)
|
||||
updated_container_entity_parent_id = updated_container_entity.get_parent_id()
|
||||
has_correct_parent = updated_container_entity_parent_id.ToString() == parent_entity_id.ToString()
|
||||
assert has_correct_parent, "Prefab reparented is *not* under the expected parent entity"
|
||||
container_entity_id_after_reparent = set(new_parent_after_reparent_children_ids).difference(new_parent_before_reparent_children_ids).pop()
|
||||
reparented_container_entity = EditorEntity(container_entity_id_after_reparent)
|
||||
reparented_container_entity_parent_id = reparented_container_entity.get_parent_id()
|
||||
has_correct_parent = reparented_container_entity_parent_id.ToString() == parent_entity_id.ToString()
|
||||
assert has_correct_parent, "Prefab Instance reparented is *not* under the expected parent entity"
|
||||
|
||||
self.container_entity = EditorEntity(updated_container_entity_id)
|
||||
self.container_entity = reparented_container_entity
|
||||
|
||||
# This is a helper class which contains some of the useful information about a prefab template.
|
||||
class Prefab:
|
||||
@@ -81,7 +97,7 @@ class Prefab:
|
||||
def __init__(self, file_name: str):
|
||||
self.file_name:str = file_name
|
||||
self.file_path: str = prefab_test_utils.get_prefab_file_path(file_name)
|
||||
self.instances: dict = {}
|
||||
self.instances: set[PrefabInstance] = set()
|
||||
|
||||
"""
|
||||
Check if a prefab is ready to be used to generate its instances.
|
||||
@@ -122,10 +138,10 @@ class Prefab:
|
||||
:param entities: The entities that should form the new prefab (along with their descendants).
|
||||
:param file_name: A unique file name of new prefab.
|
||||
:param prefab_instance_name: A name for the very first instance generated while prefab creation. The default instance name is the same as file_name.
|
||||
:return: An outcome object with an entityId of the new prefab's container entity; on failure, it comes with an error message detailing the cause of the error.
|
||||
:return: Created Prefab object and the very first PrefabInstance object owned by the prefab.
|
||||
"""
|
||||
@classmethod
|
||||
def create_prefab(cls, entities: list[EditorEntity], file_name: str, prefab_instance_name: str=None) -> Prefab:
|
||||
def create_prefab(cls, entities: list[EditorEntity], file_name: str, prefab_instance_name: str=None) -> (Prefab, PrefabInstance):
|
||||
assert not Prefab.is_prefab_loaded(file_name), f"Can't create Prefab '{file_name}' since the prefab already exists"
|
||||
|
||||
new_prefab = Prefab(file_name)
|
||||
@@ -133,18 +149,18 @@ class Prefab:
|
||||
create_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'CreatePrefabInMemory', entity_ids, new_prefab.file_path)
|
||||
assert create_prefab_result.IsSuccess(), f"Prefab operation 'CreatePrefab' failed. Error: {create_prefab_result.GetError()}"
|
||||
|
||||
container_entity = EditorEntity(create_prefab_result.GetValue())
|
||||
container_entity_id = create_prefab_result.GetValue()
|
||||
container_entity = EditorEntity(container_entity_id)
|
||||
|
||||
if prefab_instance_name:
|
||||
container_entity.set_name(prefab_instance_name)
|
||||
else:
|
||||
prefab_instance_name = file_name
|
||||
|
||||
prefab_test_utils.wait_for_propagation()
|
||||
container_entity_id = prefab_test_utils.find_entity_by_unique_name(prefab_instance_name)
|
||||
new_prefab.instances[prefab_instance_name] = PrefabInstance(prefab_instance_name, file_name, EditorEntity(container_entity_id))
|
||||
|
||||
new_prefab_instance = PrefabInstance(file_name, EditorEntity(container_entity_id))
|
||||
new_prefab.instances.add(new_prefab_instance)
|
||||
Prefab.existing_prefabs[file_name] = new_prefab
|
||||
return new_prefab
|
||||
return new_prefab, new_prefab_instance
|
||||
|
||||
"""
|
||||
Remove target prefab instances.
|
||||
@@ -152,22 +168,15 @@ class Prefab:
|
||||
"""
|
||||
@classmethod
|
||||
def remove_prefabs(cls, prefab_instances: list[PrefabInstance]):
|
||||
instances_to_remove_name_counts = Counter()
|
||||
instances_removed_expected_name_counts = Counter()
|
||||
|
||||
entities_to_remove = [prefab_instance.container_entity for prefab_instance in prefab_instances]
|
||||
while entities_to_remove:
|
||||
entity = entities_to_remove.pop(-1)
|
||||
entity_name = entity.get_name()
|
||||
instances_to_remove_name_counts[entity_name] += 1
|
||||
|
||||
entity_ids_to_remove = []
|
||||
entity_id_queue = [prefab_instance.container_entity for prefab_instance in prefab_instances]
|
||||
while entity_id_queue:
|
||||
entity = entity_id_queue.pop(0)
|
||||
children_entity_ids = entity.get_children_ids()
|
||||
for child_entity_id in children_entity_ids:
|
||||
entities_to_remove.append(EditorEntity(child_entity_id))
|
||||
entity_id_queue.append(EditorEntity(child_entity_id))
|
||||
|
||||
for entity_name, entity_count in instances_to_remove_name_counts.items():
|
||||
entities = prefab_test_utils.find_entities_by_name(entity_name)
|
||||
instances_removed_expected_name_counts[entity_name] = len(entities) - entity_count
|
||||
entity_ids_to_remove.append(entity.id)
|
||||
|
||||
container_entity_ids = [prefab_instance.container_entity.id for prefab_instance in prefab_instances]
|
||||
delete_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'DeleteEntitiesAndAllDescendantsInInstance', container_entity_ids)
|
||||
@@ -175,28 +184,24 @@ class Prefab:
|
||||
|
||||
prefab_test_utils.wait_for_propagation()
|
||||
|
||||
prefab_entities_deleted = True
|
||||
for entity_name, expected_entity_count in instances_removed_expected_name_counts.items():
|
||||
actual_entity_count = len(prefab_test_utils.find_entities_by_name(entity_name))
|
||||
if actual_entity_count is not expected_entity_count:
|
||||
prefab_entities_deleted = False
|
||||
break
|
||||
|
||||
assert prefab_entities_deleted, "Not all entities and descendants in target prefabs are deleted."
|
||||
entity_ids_after_delete = set(prefab_test_utils.get_all_entities())
|
||||
for entity_id_removed in entity_ids_to_remove:
|
||||
if entity_id_removed in entity_ids_after_delete:
|
||||
assert prefab_entities_deleted, "Not all entities and descendants in target prefabs are deleted."
|
||||
|
||||
for instance in prefab_instances:
|
||||
instance_deleted_prefab = Prefab.get_prefab(instance.prefab_file_name)
|
||||
instance_deleted_prefab.instances.pop(instance.name)
|
||||
instance_deleted_prefab.instances.remove(instance)
|
||||
instance = PrefabInstance()
|
||||
|
||||
"""
|
||||
Instantiate an instance of this prefab.
|
||||
:param name: A name for newly instantiated prefab instance. The default instance name is the same as this prefab's file name.
|
||||
:param parent_entity: The entity the prefab should be a child of in the transform hierarchy.
|
||||
:param name: A name for newly instantiated prefab instance. The default instance name is the same as this prefab's file name.
|
||||
:param prefab_position: The position in world space the prefab should be instantiated in.
|
||||
:return: An outcome object with an entityId of the new prefab's container entity; on failure, it comes with an error message detailing the cause of the error.
|
||||
:return: Instantiated PrefabInstance object owned by this prefab.
|
||||
"""
|
||||
def instantiate(self, name: str=None, parent_entity: EditorEntity=None, prefab_position: Vector3=Vector3()) -> PrefabInstance:
|
||||
def instantiate(self, parent_entity: EditorEntity=None, name: str=None, prefab_position: Vector3=Vector3()) -> PrefabInstance:
|
||||
parent_entity_id = parent_entity.id if parent_entity is not None else EntityId()
|
||||
|
||||
instantiate_prefab_result = prefab.PrefabPublicRequestBus(
|
||||
@@ -209,13 +214,13 @@ class Prefab:
|
||||
|
||||
if name:
|
||||
container_entity.set_name(name)
|
||||
else:
|
||||
name = self.file_name
|
||||
|
||||
prefab_test_utils.wait_for_propagation()
|
||||
container_entity_id = prefab_test_utils.find_entity_by_unique_name(name)
|
||||
self.instances[name] = PrefabInstance(name, self.file_name, EditorEntity(container_entity_id))
|
||||
|
||||
new_prefab_instance = PrefabInstance(self.file_name, EditorEntity(container_entity_id))
|
||||
assert not new_prefab_instance in self.instances, "This prefab instance is already existed before this instantiation."
|
||||
self.instances.add(new_prefab_instance)
|
||||
|
||||
prefab_test_utils.check_entity_at_position(container_entity_id, prefab_position)
|
||||
|
||||
return container_entity_id
|
||||
return new_prefab_instance
|
||||
|
||||
+1
-2
@@ -22,11 +22,10 @@ def Prefab_BasicWorkflow_CreateAndDeletePrefab():
|
||||
car_prefab_entities = [car_entity]
|
||||
|
||||
# Checks for prefab creation passed or not
|
||||
car_prefab = Prefab.create_prefab(
|
||||
_, car = Prefab.create_prefab(
|
||||
car_prefab_entities, CAR_PREFAB_FILE_NAME)
|
||||
|
||||
# Checks for prefab deletion passed or not
|
||||
car = car_prefab.instances[CAR_PREFAB_FILE_NAME]
|
||||
Prefab.remove_prefabs([car])
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
+2
-4
@@ -28,7 +28,7 @@ def Prefab_BasicWorkflow_CreateAndReparentPrefab():
|
||||
car_prefab_entities = [car_entity]
|
||||
|
||||
# Checks for prefab creation passed or not
|
||||
car_prefab = Prefab.create_prefab(
|
||||
_, car = Prefab.create_prefab(
|
||||
car_prefab_entities, CAR_PREFAB_FILE_NAME)
|
||||
|
||||
# Creates another new Entity at the root level
|
||||
@@ -36,12 +36,10 @@ def Prefab_BasicWorkflow_CreateAndReparentPrefab():
|
||||
wheel_prefab_entities = [wheel_entity]
|
||||
|
||||
# Checks for wheel prefab creation passed or not
|
||||
wheel_prefab = Prefab.create_prefab(
|
||||
_, wheel = Prefab.create_prefab(
|
||||
wheel_prefab_entities, WHEEL_PREFAB_FILE_NAME)
|
||||
|
||||
# Checks for prefab reparenting passed or not
|
||||
car = car_prefab.instances[CAR_PREFAB_FILE_NAME]
|
||||
wheel = wheel_prefab.instances[WHEEL_PREFAB_FILE_NAME]
|
||||
await wheel.ui_reparent_prefab_instance(car.container_entity.id)
|
||||
|
||||
run_test()
|
||||
|
||||
@@ -22,11 +22,11 @@ def Prefab_BasicWorkflow_InstantiatePrefab():
|
||||
# Checks for prefab instantiation passed or not
|
||||
test_prefab = Prefab.get_prefab(EXISTING_TEST_PREFAB_FILE_NAME)
|
||||
|
||||
instantiated_test_container_entity_id = test_prefab.instantiate(
|
||||
test_instance = test_prefab.instantiate(
|
||||
prefab_position=INSTANTIATED_TEST_PREFAB_POSITION)
|
||||
|
||||
prefab_test_utils.check_entity_children_count(
|
||||
instantiated_test_container_entity_id,
|
||||
test_instance.container_entity.id,
|
||||
EXPECTED_TEST_PREFAB_CHILDREN_COUNT)
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -29,20 +29,8 @@ def find_entities_by_name(entity_name):
|
||||
searchFilter.names = [entity_name]
|
||||
return entity.SearchBus(bus.Broadcast, 'SearchEntities', searchFilter)
|
||||
|
||||
def find_entity_by_unique_name(entity_name):
|
||||
unique_name_entity_found_result = (
|
||||
"Entity with a unique name found",
|
||||
"Entity with a unique name *not* found")
|
||||
|
||||
entities = find_entities_by_name(entity_name)
|
||||
unique_name_entity_found = len(entities) == 1
|
||||
Report.result(unique_name_entity_found_result, unique_name_entity_found)
|
||||
|
||||
if unique_name_entity_found:
|
||||
return entities[0]
|
||||
else:
|
||||
Report.info(f"{len(entities)} entities with name '{entity_name}' found")
|
||||
return EntityId()
|
||||
def get_all_entities():
|
||||
return entity.SearchBus(bus.Broadcast, 'SearchEntities', entity.SearchFilter())
|
||||
|
||||
def check_entity_at_position(entity_id, expected_entity_position):
|
||||
entity_at_expected_position_result = (
|
||||
|
||||
+21
-17
@@ -18,8 +18,9 @@
|
||||
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
|
||||
#include <AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h>
|
||||
#include <AzToolsFramework/Prefab/EditorPrefabComponent.h>
|
||||
#include <AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h>
|
||||
#include <AzToolsFramework/Prefab/Instance/Instance.h>
|
||||
#include <AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.h>
|
||||
#include <AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h>
|
||||
#include <AzToolsFramework/Prefab/PrefabDomUtils.h>
|
||||
#include <AzToolsFramework/Prefab/PrefabLoader.h>
|
||||
#include <AzToolsFramework/Prefab/PrefabSystemComponentInterface.h>
|
||||
@@ -317,17 +318,18 @@ namespace AzToolsFramework
|
||||
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Prefab::Instance>>&& nestedPrefabInstances,
|
||||
AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder)
|
||||
{
|
||||
AZStd::unique_ptr<Prefab::Instance> createdPrefabInstance =
|
||||
m_prefabSystemComponent->CreatePrefab(entities, AZStd::move(nestedPrefabInstances), filePath, nullptr, false);
|
||||
if (!instanceToParentUnder)
|
||||
{
|
||||
instanceToParentUnder = *m_rootInstance;
|
||||
}
|
||||
|
||||
AZStd::unique_ptr<Prefab::Instance> createdPrefabInstance = m_prefabSystemComponent->CreatePrefab(
|
||||
entities, AZStd::move(nestedPrefabInstances), filePath, nullptr, instanceToParentUnder, false);
|
||||
|
||||
if (createdPrefabInstance)
|
||||
{
|
||||
if (!instanceToParentUnder)
|
||||
{
|
||||
instanceToParentUnder = *m_rootInstance;
|
||||
}
|
||||
|
||||
Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(AZStd::move(createdPrefabInstance));
|
||||
Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(
|
||||
AZStd::move(createdPrefabInstance));
|
||||
AZ::Entity* containerEntity = addedInstance.m_containerEntity.get();
|
||||
containerEntity->AddComponent(aznew Prefab::EditorPrefabComponent());
|
||||
HandleEntitiesAdded({containerEntity});
|
||||
@@ -341,16 +343,18 @@ namespace AzToolsFramework
|
||||
Prefab::InstanceOptionalReference PrefabEditorEntityOwnershipService::InstantiatePrefab(
|
||||
AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder)
|
||||
{
|
||||
AZStd::unique_ptr<Prefab::Instance> createdPrefabInstance = m_prefabSystemComponent->InstantiatePrefab(filePath);
|
||||
|
||||
if (createdPrefabInstance)
|
||||
if (!instanceToParentUnder)
|
||||
{
|
||||
if (!instanceToParentUnder)
|
||||
{
|
||||
instanceToParentUnder = *m_rootInstance;
|
||||
}
|
||||
instanceToParentUnder = *m_rootInstance;
|
||||
}
|
||||
|
||||
Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(AZStd::move(createdPrefabInstance));
|
||||
AZStd::unique_ptr<Prefab::Instance> instantiatedPrefabInstance =
|
||||
m_prefabSystemComponent->InstantiatePrefab(filePath, instanceToParentUnder);
|
||||
|
||||
if (instantiatedPrefabInstance)
|
||||
{
|
||||
Prefab::Instance& addedInstance = instanceToParentUnder->get().AddInstance(
|
||||
AZStd::move(instantiatedPrefabInstance));
|
||||
HandleEntitiesAdded({addedInstance.m_containerEntity.get()});
|
||||
return addedInstance;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <AzToolsFramework/Entity/EditorEntityHelpers.h>
|
||||
#include <AzToolsFramework/Prefab/Instance/Instance.h>
|
||||
#include <AzToolsFramework/Prefab/PrefabDomUtils.h>
|
||||
#include <AzToolsFramework/Prefab/Instance/InstanceEntityIdMapper.h>
|
||||
#include <AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h>
|
||||
#include <AzToolsFramework/Prefab/Instance/TemplateInstanceMapperInterface.h>
|
||||
|
||||
@@ -28,24 +29,52 @@ namespace AzToolsFramework
|
||||
}
|
||||
|
||||
Instance::Instance(AZStd::unique_ptr<AZ::Entity> containerEntity)
|
||||
: Instance(AZStd::move(containerEntity), AZStd::nullopt, GenerateInstanceAlias())
|
||||
{
|
||||
m_instanceEntityMapper = AZ::Interface<InstanceEntityMapperInterface>::Get();
|
||||
}
|
||||
|
||||
Instance::Instance(InstanceOptionalReference parent)
|
||||
: Instance(nullptr, parent, GenerateInstanceAlias())
|
||||
{
|
||||
}
|
||||
|
||||
Instance::Instance(InstanceAlias alias)
|
||||
: Instance(nullptr, AZStd::nullopt, AZStd::move(alias))
|
||||
{
|
||||
}
|
||||
|
||||
Instance::Instance(AZStd::unique_ptr<AZ::Entity> containerEntity, InstanceOptionalReference parent)
|
||||
: Instance(AZStd::move(containerEntity), parent, GenerateInstanceAlias())
|
||||
{
|
||||
}
|
||||
|
||||
Instance::Instance(AZStd::unique_ptr<AZ::Entity> containerEntity, InstanceOptionalReference parent, InstanceAlias alias)
|
||||
: m_parent(parent.has_value() ? &parent->get() : nullptr)
|
||||
, m_alias(AZStd::move(alias))
|
||||
, m_containerEntity(containerEntity ? AZStd::move(containerEntity) : AZStd::make_unique<AZ::Entity>())
|
||||
, m_instanceEntityMapper(AZ::Interface<InstanceEntityMapperInterface>::Get())
|
||||
, m_templateInstanceMapper(AZ::Interface<TemplateInstanceMapperInterface>::Get())
|
||||
{
|
||||
AZ_Assert(m_instanceEntityMapper,
|
||||
"Instance Entity Mapper Interface could not be found. "
|
||||
"It is a requirement for the Prefab Instance class. "
|
||||
"Check that it is being correctly initialized.");
|
||||
|
||||
m_templateInstanceMapper = AZ::Interface<TemplateInstanceMapperInterface>::Get();
|
||||
|
||||
AZ_Assert(m_templateInstanceMapper,
|
||||
"Template Instance Mapper Interface could not be found. "
|
||||
"It is a requirement for the Prefab Instance class. "
|
||||
"Check that it is being correctly initialized.");
|
||||
|
||||
m_alias = GenerateInstanceAlias();
|
||||
m_containerEntity = containerEntity ? AZStd::move(containerEntity)
|
||||
: AZStd::make_unique<AZ::Entity>();
|
||||
if (parent)
|
||||
{
|
||||
AliasPath absoluteInstancePath = m_parent->GetAbsoluteInstanceAliasPath();
|
||||
absoluteInstancePath.Append(m_alias);
|
||||
absoluteInstancePath.Append(PrefabDomUtils::ContainerEntityName);
|
||||
|
||||
AZ::EntityId newContainerEntityId = InstanceEntityIdMapper::GenerateEntityIdForAliasPath(absoluteInstancePath);
|
||||
m_containerEntity->SetId(newContainerEntityId);
|
||||
}
|
||||
|
||||
RegisterEntity(m_containerEntity->GetId(), PrefabDomUtils::ContainerEntityName);
|
||||
}
|
||||
|
||||
@@ -69,12 +98,12 @@ namespace AzToolsFramework
|
||||
}
|
||||
}
|
||||
|
||||
const TemplateId& Instance::GetTemplateId() const
|
||||
TemplateId Instance::GetTemplateId() const
|
||||
{
|
||||
return m_templateId;
|
||||
}
|
||||
|
||||
void Instance::SetTemplateId(const TemplateId& templateId)
|
||||
void Instance::SetTemplateId(TemplateId templateId)
|
||||
{
|
||||
// If we aren't changing the template Id, there's no need to unregister / re-register
|
||||
if (templateId == m_templateId)
|
||||
@@ -295,20 +324,21 @@ namespace AzToolsFramework
|
||||
}
|
||||
|
||||
Instance& Instance::AddInstance(AZStd::unique_ptr<Instance> instance)
|
||||
{
|
||||
InstanceAlias newInstanceAlias = GenerateInstanceAlias();
|
||||
return AddInstance(AZStd::move(instance), newInstanceAlias);
|
||||
}
|
||||
|
||||
Instance& Instance::AddInstance(AZStd::unique_ptr<Instance> instance, InstanceAlias newInstanceAlias)
|
||||
{
|
||||
AZ_Assert(instance.get(), "instance argument is nullptr");
|
||||
|
||||
if (instance->GetInstanceAlias().empty())
|
||||
{
|
||||
instance->m_alias = GenerateInstanceAlias();
|
||||
}
|
||||
|
||||
AZ_Assert(
|
||||
m_nestedInstances.find(newInstanceAlias) == m_nestedInstances.end(),
|
||||
m_nestedInstances.find(instance->GetInstanceAlias()) == m_nestedInstances.end(),
|
||||
"InstanceAlias' unique id collision, this should never happen.");
|
||||
|
||||
instance->m_parent = this;
|
||||
instance->m_alias = newInstanceAlias;
|
||||
return *(m_nestedInstances[newInstanceAlias] = std::move(instance));
|
||||
auto& alias = instance->GetInstanceAlias();
|
||||
return *(m_nestedInstances[alias] = AZStd::move(instance));
|
||||
}
|
||||
|
||||
void Instance::DetachNestedInstances(const AZStd::function<void(AZStd::unique_ptr<Instance>)>& callback)
|
||||
|
||||
@@ -65,6 +65,9 @@ namespace AzToolsFramework
|
||||
|
||||
Instance();
|
||||
explicit Instance(AZStd::unique_ptr<AZ::Entity> containerEntity);
|
||||
explicit Instance(InstanceOptionalReference parent);
|
||||
explicit Instance(AZStd::unique_ptr<AZ::Entity> containerEntity, InstanceOptionalReference parent);
|
||||
explicit Instance(InstanceAlias alias);
|
||||
virtual ~Instance();
|
||||
|
||||
Instance(const Instance& rhs) = delete;
|
||||
@@ -72,8 +75,8 @@ namespace AzToolsFramework
|
||||
|
||||
static void Reflect(AZ::ReflectContext* context);
|
||||
|
||||
const TemplateId& GetTemplateId() const;
|
||||
void SetTemplateId(const TemplateId& templateId);
|
||||
TemplateId GetTemplateId() const;
|
||||
void SetTemplateId(TemplateId templateId);
|
||||
|
||||
const AZ::IO::Path& GetTemplateSourcePath() const;
|
||||
void SetTemplateSourcePath(AZ::IO::PathView sourcePath);
|
||||
@@ -97,7 +100,6 @@ namespace AzToolsFramework
|
||||
void Reset();
|
||||
|
||||
Instance& AddInstance(AZStd::unique_ptr<Instance> instance);
|
||||
Instance& AddInstance(AZStd::unique_ptr<Instance> instance, InstanceAlias instanceAlias);
|
||||
AZStd::unique_ptr<Instance> DetachNestedInstance(const InstanceAlias& instanceAlias);
|
||||
void DetachNestedInstances(const AZStd::function<void(AZStd::unique_ptr<Instance>)>& callback);
|
||||
|
||||
@@ -184,6 +186,8 @@ namespace AzToolsFramework
|
||||
private:
|
||||
static constexpr const char s_aliasPathSeparator = '/';
|
||||
|
||||
Instance(AZStd::unique_ptr<AZ::Entity> containerEntity, InstanceOptionalReference parent, InstanceAlias alias);
|
||||
|
||||
void ClearEntities();
|
||||
|
||||
void RemoveEntities(const AZStd::function<bool(const AZStd::unique_ptr<AZ::Entity>&)>& filter);
|
||||
|
||||
+4
-4
@@ -27,7 +27,7 @@ namespace AzToolsFramework
|
||||
}
|
||||
|
||||
|
||||
bool TemplateInstanceMapper::RegisterTemplate(const TemplateId& templateId)
|
||||
bool TemplateInstanceMapper::RegisterTemplate(TemplateId templateId)
|
||||
{
|
||||
const bool result = m_templateIdToInstancesMap.emplace(templateId, InstanceSet()).second;
|
||||
AZ_Assert(result,
|
||||
@@ -39,7 +39,7 @@ namespace AzToolsFramework
|
||||
return result;
|
||||
}
|
||||
|
||||
bool TemplateInstanceMapper::UnregisterTemplate(const TemplateId& templateId)
|
||||
bool TemplateInstanceMapper::UnregisterTemplate(TemplateId templateId)
|
||||
{
|
||||
const bool result = m_templateIdToInstancesMap.erase(templateId) != 0;
|
||||
AZ_Assert(result,
|
||||
@@ -53,7 +53,7 @@ namespace AzToolsFramework
|
||||
|
||||
bool TemplateInstanceMapper::RegisterInstanceToTemplate(Instance& instance)
|
||||
{
|
||||
const TemplateId& templateId = instance.GetTemplateId();
|
||||
TemplateId templateId = instance.GetTemplateId();
|
||||
if (templateId == InvalidTemplateId)
|
||||
{
|
||||
return false;
|
||||
@@ -79,7 +79,7 @@ namespace AzToolsFramework
|
||||
found->second.erase(&instance) != 0;
|
||||
}
|
||||
|
||||
InstanceSetConstReference TemplateInstanceMapper::FindInstancesOwnedByTemplate(const TemplateId& templateId) const
|
||||
InstanceSetConstReference TemplateInstanceMapper::FindInstancesOwnedByTemplate(TemplateId templateId) const
|
||||
{
|
||||
auto found = m_templateIdToInstancesMap.find(templateId);
|
||||
|
||||
|
||||
+3
-3
@@ -26,10 +26,10 @@ namespace AzToolsFramework
|
||||
TemplateInstanceMapper();
|
||||
~TemplateInstanceMapper() override;
|
||||
|
||||
InstanceSetConstReference FindInstancesOwnedByTemplate(const TemplateId& templateId) const override;
|
||||
InstanceSetConstReference FindInstancesOwnedByTemplate(TemplateId templateId) const override;
|
||||
|
||||
bool RegisterTemplate(const TemplateId& templateId);
|
||||
bool UnregisterTemplate(const TemplateId& templateId);
|
||||
bool RegisterTemplate(TemplateId templateId);
|
||||
bool UnregisterTemplate(TemplateId templateId);
|
||||
|
||||
protected:
|
||||
bool RegisterInstanceToTemplate(Instance& instance) override;
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ namespace AzToolsFramework
|
||||
AZ_RTTI(TemplateInstanceMapperInterface, "{5DCCCDAA-3441-4266-9670-B349386E0129}");
|
||||
|
||||
virtual ~TemplateInstanceMapperInterface() = default;
|
||||
virtual InstanceSetConstReference FindInstancesOwnedByTemplate(const TemplateId& templateId) const = 0;
|
||||
virtual InstanceSetConstReference FindInstancesOwnedByTemplate(TemplateId templateId) const = 0;
|
||||
|
||||
protected:
|
||||
// Only the Instance class is allowed to register and unregister Instances.
|
||||
|
||||
@@ -122,12 +122,12 @@ namespace AzToolsFramework
|
||||
!m_instanceName.empty();
|
||||
}
|
||||
|
||||
const TemplateId& Link::GetSourceTemplateId() const
|
||||
TemplateId Link::GetSourceTemplateId() const
|
||||
{
|
||||
return m_sourceTemplateId;
|
||||
}
|
||||
|
||||
const TemplateId& Link::GetTargetTemplateId() const
|
||||
TemplateId Link::GetTargetTemplateId() const
|
||||
{
|
||||
return m_targetTemplateId;
|
||||
}
|
||||
|
||||
@@ -48,8 +48,8 @@ namespace AzToolsFramework
|
||||
|
||||
bool IsValid() const;
|
||||
|
||||
const TemplateId& GetSourceTemplateId() const;
|
||||
const TemplateId& GetTargetTemplateId() const;
|
||||
TemplateId GetSourceTemplateId() const;
|
||||
TemplateId GetTargetTemplateId() const;
|
||||
|
||||
LinkId GetId() const;
|
||||
|
||||
|
||||
@@ -92,7 +92,17 @@ namespace AzToolsFramework
|
||||
|
||||
AZStd::unique_ptr<Instance> PrefabSystemComponent::CreatePrefab(
|
||||
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume,
|
||||
AZ::IO::PathView filePath, AZStd::unique_ptr<AZ::Entity> containerEntity, bool shouldCreateLinks)
|
||||
AZ::IO::PathView filePath, AZStd::unique_ptr<AZ::Entity> containerEntity, InstanceOptionalReference parent,
|
||||
bool shouldCreateLinks)
|
||||
{
|
||||
AZStd::unique_ptr<Instance> newInstance = AZStd::make_unique<Instance>(AZStd::move(containerEntity), parent);
|
||||
CreatePrefab(entities, AZStd::move(instancesToConsume), filePath, newInstance, shouldCreateLinks);
|
||||
return newInstance;
|
||||
}
|
||||
|
||||
void PrefabSystemComponent::CreatePrefab(
|
||||
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume,
|
||||
AZ::IO::PathView filePath, AZStd::unique_ptr<Instance>& newInstance, bool shouldCreateLinks)
|
||||
{
|
||||
AZ::IO::Path relativeFilePath = m_prefabLoader.GenerateRelativePath(filePath);
|
||||
if (GetTemplateIdFromFilePath(relativeFilePath) != InvalidTemplateId)
|
||||
@@ -101,11 +111,9 @@ namespace AzToolsFramework
|
||||
"Filepath %s has already been registered with the Prefab System Component",
|
||||
relativeFilePath.c_str());
|
||||
|
||||
return nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
AZStd::unique_ptr<Instance> newInstance = AZStd::make_unique<Instance>(AZStd::move(containerEntity));
|
||||
|
||||
for (AZ::Entity* entity : entities)
|
||||
{
|
||||
AZ_Assert(entity, "Prefab - Null entity passed in during Create Prefab");
|
||||
@@ -136,8 +144,6 @@ namespace AzToolsFramework
|
||||
{
|
||||
newInstance->SetTemplateId(newTemplateId);
|
||||
}
|
||||
|
||||
return newInstance;
|
||||
}
|
||||
|
||||
void PrefabSystemComponent::PropagateTemplateChanges(TemplateId templateId, InstanceOptionalReference instanceToExclude)
|
||||
@@ -171,7 +177,7 @@ namespace AzToolsFramework
|
||||
}
|
||||
}
|
||||
|
||||
void PrefabSystemComponent::UpdatePrefabInstances(const TemplateId& templateId, InstanceOptionalReference instanceToExclude)
|
||||
void PrefabSystemComponent::UpdatePrefabInstances(TemplateId templateId, InstanceOptionalReference instanceToExclude)
|
||||
{
|
||||
m_instanceUpdateExecutor.AddTemplateInstancesToQueue(templateId, instanceToExclude);
|
||||
}
|
||||
@@ -256,7 +262,8 @@ namespace AzToolsFramework
|
||||
}
|
||||
}
|
||||
|
||||
AZStd::unique_ptr<Instance> PrefabSystemComponent::InstantiatePrefab(AZ::IO::PathView filePath)
|
||||
AZStd::unique_ptr<Instance> PrefabSystemComponent::InstantiatePrefab(
|
||||
AZ::IO::PathView filePath, InstanceOptionalReference parent)
|
||||
{
|
||||
// Retrieve the template id for the source prefab filepath
|
||||
Prefab::TemplateId templateId = GetTemplateIdFromFilePath(filePath);
|
||||
@@ -276,10 +283,11 @@ namespace AzToolsFramework
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return InstantiatePrefab(templateId);
|
||||
return InstantiatePrefab(templateId, parent);
|
||||
}
|
||||
|
||||
AZStd::unique_ptr<Instance> PrefabSystemComponent::InstantiatePrefab(const TemplateId& templateId)
|
||||
AZStd::unique_ptr<Instance> PrefabSystemComponent::InstantiatePrefab(
|
||||
TemplateId templateId, InstanceOptionalReference parent)
|
||||
{
|
||||
TemplateReference instantiatingTemplate = FindTemplate(templateId);
|
||||
|
||||
@@ -292,7 +300,7 @@ namespace AzToolsFramework
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto newInstance = AZStd::make_unique<Instance>();
|
||||
auto newInstance = AZStd::make_unique<Instance>(parent);
|
||||
Instance::EntityList newEntities;
|
||||
if (!PrefabDomUtils::LoadInstanceFromPrefabDom(*newInstance, newEntities, instantiatingTemplate->get().GetPrefabDom()))
|
||||
{
|
||||
@@ -354,7 +362,7 @@ namespace AzToolsFramework
|
||||
return newTemplateId;
|
||||
}
|
||||
|
||||
TemplateReference PrefabSystemComponent::FindTemplate(const TemplateId& id)
|
||||
TemplateReference PrefabSystemComponent::FindTemplate(TemplateId id)
|
||||
{
|
||||
auto found = m_templateIdMap.find(id);
|
||||
if (found != m_templateIdMap.end())
|
||||
@@ -466,7 +474,7 @@ namespace AzToolsFramework
|
||||
templateToChange.SetFilePath(filePath);
|
||||
}
|
||||
|
||||
void PrefabSystemComponent::RemoveTemplate(const TemplateId& templateId)
|
||||
void PrefabSystemComponent::RemoveTemplate(TemplateId templateId)
|
||||
{
|
||||
auto findTemplateResult = FindTemplate(templateId);
|
||||
if (!findTemplateResult.has_value())
|
||||
@@ -553,8 +561,8 @@ namespace AzToolsFramework
|
||||
}
|
||||
|
||||
LinkId PrefabSystemComponent::AddLink(
|
||||
const TemplateId& sourceTemplateId,
|
||||
const TemplateId& targetTemplateId,
|
||||
TemplateId sourceTemplateId,
|
||||
TemplateId targetTemplateId,
|
||||
PrefabDomValue::MemberIterator& instanceIterator,
|
||||
InstanceOptionalReference instance)
|
||||
{
|
||||
@@ -616,8 +624,8 @@ namespace AzToolsFramework
|
||||
}
|
||||
|
||||
LinkId PrefabSystemComponent::CreateLink(
|
||||
const TemplateId& linkTargetId,
|
||||
const TemplateId& linkSourceId,
|
||||
TemplateId linkTargetId,
|
||||
TemplateId linkSourceId,
|
||||
const InstanceAlias& instanceAlias,
|
||||
const PrefabDomConstReference linkPatches,
|
||||
const LinkId& linkId)
|
||||
@@ -774,7 +782,7 @@ namespace AzToolsFramework
|
||||
}
|
||||
}
|
||||
|
||||
bool PrefabSystemComponent::IsTemplateDirty(const TemplateId& templateId)
|
||||
bool PrefabSystemComponent::IsTemplateDirty(TemplateId templateId)
|
||||
{
|
||||
auto templateRef = FindTemplate(templateId);
|
||||
|
||||
@@ -786,7 +794,7 @@ namespace AzToolsFramework
|
||||
return false;
|
||||
}
|
||||
|
||||
void PrefabSystemComponent::SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty)
|
||||
void PrefabSystemComponent::SetTemplateDirtyFlag(TemplateId templateId, bool dirty)
|
||||
{
|
||||
auto templateRef = FindTemplate(templateId);
|
||||
|
||||
@@ -940,7 +948,7 @@ namespace AzToolsFramework
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PrefabSystemComponent::GenerateLinksForNewTemplate(const TemplateId& newTemplateId, Instance& instance)
|
||||
bool PrefabSystemComponent::GenerateLinksForNewTemplate(TemplateId newTemplateId, Instance& instance)
|
||||
{
|
||||
TemplateReference newTemplateReference = FindTemplate(newTemplateId);
|
||||
if (!newTemplateReference.has_value())
|
||||
@@ -980,7 +988,7 @@ namespace AzToolsFramework
|
||||
}
|
||||
|
||||
const PrefabDomValue& source = instanceSourceReference->get();
|
||||
const TemplateId& nestedTemplateId = GetTemplateIdFromFilePath(source.GetString());
|
||||
TemplateId nestedTemplateId = GetTemplateIdFromFilePath(source.GetString());
|
||||
if (nestedTemplateId == InvalidTemplateId)
|
||||
{
|
||||
AZ_Error("Prefab", false,
|
||||
|
||||
@@ -84,7 +84,7 @@ namespace AzToolsFramework
|
||||
* @param id A unique id of a Template.
|
||||
* @return Reference of Template if the Template exists.
|
||||
*/
|
||||
TemplateReference FindTemplate(const TemplateId& id) override;
|
||||
TemplateReference FindTemplate(TemplateId id) override;
|
||||
|
||||
/**
|
||||
* Find Link with given Link id from Prefab System Component.
|
||||
@@ -112,7 +112,7 @@ namespace AzToolsFramework
|
||||
* Remove the Template associated with the given id from Prefab System Component.
|
||||
* @param templateId A unique id of a Template.
|
||||
*/
|
||||
void RemoveTemplate(const TemplateId& templateId) override;
|
||||
void RemoveTemplate(TemplateId templateId) override;
|
||||
|
||||
/**
|
||||
* Remove all Templates from the Prefab System Component.
|
||||
@@ -121,17 +121,21 @@ namespace AzToolsFramework
|
||||
|
||||
/**
|
||||
* Generates a new Prefab Instance based on the Template whose source is stored in filepath.
|
||||
* @param filePath the path to the prefab source file containing the template being instantiated.
|
||||
* @param filePath The path to the prefab source file containing the template being instantiated.
|
||||
* @param parent Reference of the target instance the instantiated instance will be placed under.
|
||||
* @return A unique_ptr to the newly instantiated instance. Null if operation failed.
|
||||
*/
|
||||
AZStd::unique_ptr<Instance> InstantiatePrefab(AZ::IO::PathView filePath) override;
|
||||
AZStd::unique_ptr<Instance> InstantiatePrefab(
|
||||
AZ::IO::PathView filePath, InstanceOptionalReference parent = AZStd::nullopt) override;
|
||||
|
||||
/**
|
||||
* Generates a new Prefab Instance based on the Template referenced by templateId
|
||||
* @param templateId the id of the template being instantiated.
|
||||
* Generates a new Prefab Instance based on the Template referenced by templateId.
|
||||
* @param templateId The id of the template being instantiated.
|
||||
* @param parent Reference of the target instance the instantiated instance will be placed under.
|
||||
* @return A unique_ptr to the newly instantiated instance. Null if operation failed.
|
||||
*/
|
||||
AZStd::unique_ptr<Instance> InstantiatePrefab(const TemplateId& templateId) override;
|
||||
AZStd::unique_ptr<Instance> InstantiatePrefab(
|
||||
TemplateId templateId, InstanceOptionalReference parent = AZStd::nullopt) override;
|
||||
|
||||
/**
|
||||
* Add a new Link into Prefab System Component and create a unique id for it.
|
||||
@@ -142,8 +146,8 @@ namespace AzToolsFramework
|
||||
* @return A unique id for the new Link.
|
||||
*/
|
||||
LinkId AddLink(
|
||||
const TemplateId& sourceTemplateId,
|
||||
const TemplateId& targetTemplateId,
|
||||
TemplateId sourceTemplateId,
|
||||
TemplateId targetTemplateId,
|
||||
PrefabDomValue::MemberIterator& instanceIterator,
|
||||
InstanceOptionalReference instance) override;
|
||||
|
||||
@@ -157,8 +161,8 @@ namespace AzToolsFramework
|
||||
* @return A unique id for the new Link.
|
||||
*/
|
||||
LinkId CreateLink(
|
||||
const TemplateId& linkTargetId,
|
||||
const TemplateId& linkSourceId,
|
||||
TemplateId linkTargetId,
|
||||
TemplateId linkSourceId,
|
||||
const InstanceAlias& instanceAlias,
|
||||
const PrefabDomConstReference linkPatches,
|
||||
const LinkId& linkId = InvalidLinkId) override;
|
||||
@@ -181,14 +185,14 @@ namespace AzToolsFramework
|
||||
* @param templateId The id of the template to query.
|
||||
* @return The value of the dirty flag on the template.
|
||||
*/
|
||||
bool IsTemplateDirty(const TemplateId& templateId) override;
|
||||
bool IsTemplateDirty(TemplateId templateId) override;
|
||||
|
||||
/**
|
||||
* Sets the dirty flag of the template to the value provided.
|
||||
* @param templateId The id of the template to flag.
|
||||
* @param dirty The new value of the dirty flag.
|
||||
*/
|
||||
void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) override;
|
||||
void SetTemplateDirtyFlag(TemplateId templateId, bool dirty) override;
|
||||
|
||||
bool AreDirtyTemplatesPresent(TemplateId rootTemplateId) override;
|
||||
|
||||
@@ -200,20 +204,21 @@ namespace AzToolsFramework
|
||||
|
||||
/**
|
||||
* Builds a new Prefab Template out of entities and instances and returns the first instance comprised of
|
||||
* these entities and instances
|
||||
* @param entities A vector of entities that will be used in the new instance. May be empty
|
||||
* these entities and instances.
|
||||
* @param entities A vector of entities that will be used in the new instance. May be empty.
|
||||
* @param instances A vector of Prefab Instances that will be nested in the new instance, will be consumed and moved.
|
||||
* May be empty
|
||||
* @param filePath the path to associate the template of the new instance to.
|
||||
* May be empty.
|
||||
* @param filePath The path to associate the template of the new instance to.
|
||||
* @param containerEntity The container entity for the prefab to be created. It will be created if a nullptr is provided.
|
||||
* @param parent Reference of an instance the created instance will be placed under, if given.
|
||||
* @param shouldCreateLinks The flag indicating if links should be created between the templates of the instance
|
||||
* and its nested instances.
|
||||
* @return A pointer to the newly created instance. nullptr on failure
|
||||
* @return A pointer to the newly created instance. nullptr on failure.
|
||||
*/
|
||||
AZStd::unique_ptr<Instance> CreatePrefab(
|
||||
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume,
|
||||
AZ::IO::PathView filePath, AZStd::unique_ptr<AZ::Entity> containerEntity = nullptr,
|
||||
bool ShouldCreateLinks = true) override;
|
||||
InstanceOptionalReference parent = AZStd::nullopt, bool shouldCreateLinks = true) override;
|
||||
|
||||
PrefabDom& FindTemplateDom(TemplateId templateId) override;
|
||||
|
||||
@@ -232,11 +237,26 @@ namespace AzToolsFramework
|
||||
*
|
||||
* @param templateId The id of the Template owning Instances to update.
|
||||
*/
|
||||
void UpdatePrefabInstances(const TemplateId& templateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt);
|
||||
void UpdatePrefabInstances(TemplateId templateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt);
|
||||
|
||||
private:
|
||||
AZ_DISABLE_COPY_MOVE(PrefabSystemComponent);
|
||||
|
||||
/**
|
||||
* Builds a new Prefab Template out of entities and instances and returns the first instance comprised of
|
||||
* these entities and instances.
|
||||
* @param entities A vector of entities that will be used in the new instance. May be empty.
|
||||
* @param instances A vector of Prefab Instances that will be nested in the new instance, will be consumed and moved.
|
||||
* May be empty.
|
||||
* @param filePath The path to associate the template of the new instance to.
|
||||
* @param instance Reference of a pointer to the newly created instance which needs initiation.
|
||||
* @param shouldCreateLinks The flag indicating if links should be created between the templates of the instance
|
||||
* and its nested instances.
|
||||
*/
|
||||
void CreatePrefab(const AZStd::vector<AZ::Entity*>& entities,
|
||||
AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume, AZ::IO::PathView filePath,
|
||||
AZStd::unique_ptr<Instance>& instance, bool shouldCreateLinks);
|
||||
|
||||
/**
|
||||
* Updates all the linked Instances corresponding to the linkIds in the provided queue.
|
||||
* Queue gets populated with more linkId lists as linked instances are updated. Updating stops when the queue is empty.
|
||||
@@ -310,7 +330,7 @@ namespace AzToolsFramework
|
||||
* @param instance The instance that the template was created from. This needs to be editable for inserting linkId into it.
|
||||
* @return bool on whether the operation succeeded
|
||||
*/
|
||||
bool GenerateLinksForNewTemplate(const TemplateId& newTemplateId, Instance& instance);
|
||||
bool GenerateLinksForNewTemplate(TemplateId newTemplateId, Instance& instance);
|
||||
|
||||
/**
|
||||
* Create a unique Template id for newly created Template.
|
||||
|
||||
+12
-9
@@ -29,28 +29,28 @@ namespace AzToolsFramework
|
||||
public:
|
||||
AZ_RTTI(PrefabSystemComponentInterface, "{8E95A029-67F9-4F74-895F-DDBFE29516A0}");
|
||||
|
||||
virtual TemplateReference FindTemplate(const TemplateId& id) = 0;
|
||||
virtual TemplateReference FindTemplate(TemplateId id) = 0;
|
||||
virtual LinkReference FindLink(const LinkId& id) = 0;
|
||||
|
||||
virtual TemplateId AddTemplate(const AZ::IO::Path& filePath, PrefabDom prefabDom) = 0;
|
||||
virtual void UpdateTemplateFilePath(TemplateId templateId, const AZ::IO::PathView& filePath) = 0;
|
||||
virtual void RemoveTemplate(const TemplateId& templateId) = 0;
|
||||
virtual void RemoveTemplate(TemplateId templateId) = 0;
|
||||
virtual void RemoveAllTemplates() = 0;
|
||||
|
||||
virtual LinkId AddLink(const TemplateId& sourceTemplateId, const TemplateId& targetTemplateId,
|
||||
virtual LinkId AddLink(TemplateId sourceTemplateId, TemplateId targetTemplateId,
|
||||
PrefabDomValue::MemberIterator& instanceIterator, InstanceOptionalReference instance) = 0;
|
||||
|
||||
//creates a new Link
|
||||
virtual LinkId CreateLink(
|
||||
const TemplateId& linkTargetId, const TemplateId& linkSourceId, const InstanceAlias& instanceAlias,
|
||||
TemplateId linkTargetId, TemplateId linkSourceId, const InstanceAlias& instanceAlias,
|
||||
const PrefabDomConstReference linkPatches, const LinkId& linkId = InvalidLinkId) = 0;
|
||||
|
||||
virtual void RemoveLink(const LinkId& linkId) = 0;
|
||||
|
||||
virtual TemplateId GetTemplateIdFromFilePath(AZ::IO::PathView filePath) const = 0;
|
||||
|
||||
virtual bool IsTemplateDirty(const TemplateId& templateId) = 0;
|
||||
virtual void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) = 0;
|
||||
virtual bool IsTemplateDirty(TemplateId templateId) = 0;
|
||||
virtual void SetTemplateDirtyFlag(TemplateId templateId, bool dirty) = 0;
|
||||
|
||||
//! Recursive function to check if the template is dirty or if any dirty templates are presents in the links of the template.
|
||||
//! @param rootTemplateId The id of the template provided as the beginning template to check the outgoing links.
|
||||
@@ -69,11 +69,14 @@ namespace AzToolsFramework
|
||||
virtual void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) = 0;
|
||||
virtual void PropagateTemplateChanges(TemplateId templateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt) = 0;
|
||||
|
||||
virtual AZStd::unique_ptr<Instance> InstantiatePrefab(AZ::IO::PathView filePath) = 0;
|
||||
virtual AZStd::unique_ptr<Instance> InstantiatePrefab(const TemplateId& templateId) = 0;
|
||||
virtual AZStd::unique_ptr<Instance> InstantiatePrefab(
|
||||
AZ::IO::PathView filePath, InstanceOptionalReference parent = AZStd::nullopt) = 0;
|
||||
virtual AZStd::unique_ptr<Instance> InstantiatePrefab(
|
||||
TemplateId templateId, InstanceOptionalReference parent = AZStd::nullopt) = 0;
|
||||
virtual AZStd::unique_ptr<Instance> CreatePrefab(const AZStd::vector<AZ::Entity*>& entities,
|
||||
AZStd::vector<AZStd::unique_ptr<Instance>>&& instancesToConsume, AZ::IO::PathView filePath,
|
||||
AZStd::unique_ptr<AZ::Entity> containerEntity = nullptr, bool ShouldCreateLinks = true) = 0;
|
||||
AZStd::unique_ptr<AZ::Entity> containerEntity = nullptr, InstanceOptionalReference parent = AZStd::nullopt,
|
||||
bool shouldCreateLinks = true) = 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace AzToolsFramework
|
||||
void PrefabUndoInstance::Capture(
|
||||
const PrefabDom& initialState,
|
||||
const PrefabDom& endState,
|
||||
const TemplateId& templateId)
|
||||
TemplateId templateId)
|
||||
{
|
||||
m_templateId = templateId;
|
||||
|
||||
@@ -136,8 +136,8 @@ namespace AzToolsFramework
|
||||
}
|
||||
|
||||
void PrefabUndoInstanceLink::Capture(
|
||||
const TemplateId& targetId,
|
||||
const TemplateId& sourceId,
|
||||
TemplateId targetId,
|
||||
TemplateId sourceId,
|
||||
const InstanceAlias& instanceAlias,
|
||||
PrefabDom linkPatches,
|
||||
const LinkId linkId)
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace AzToolsFramework
|
||||
void Capture(
|
||||
const PrefabDom& initialState,
|
||||
const PrefabDom& endState,
|
||||
const TemplateId& templateId);
|
||||
TemplateId templateId);
|
||||
|
||||
void Undo() override;
|
||||
void Redo() override;
|
||||
@@ -95,8 +95,8 @@ namespace AzToolsFramework
|
||||
|
||||
//capture for add/remove
|
||||
void Capture(
|
||||
const TemplateId& targetId,
|
||||
const TemplateId& sourceId,
|
||||
TemplateId targetId,
|
||||
TemplateId sourceId,
|
||||
const InstanceAlias& instanceAlias,
|
||||
PrefabDom linkPatches = PrefabDom(),
|
||||
const LinkId linkId = InvalidLinkId);
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace Benchmark
|
||||
AZStd::unique_ptr<Instance> instance = m_prefabSystemComponent->CreatePrefab(
|
||||
entities
|
||||
, {}
|
||||
, m_pathString);
|
||||
, m_pathString);
|
||||
|
||||
state.PauseTiming();
|
||||
|
||||
@@ -165,7 +165,7 @@ namespace Benchmark
|
||||
{
|
||||
nestedInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
||||
{},
|
||||
MakeInstanceList( AZStd::move(nestedInstanceRoot) ),
|
||||
MakeInstanceList(AZStd::move(nestedInstanceRoot)),
|
||||
m_paths[instanceCounter]);
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -36,7 +36,7 @@ namespace Benchmark
|
||||
|
||||
AZStd::unique_ptr<Instance> enclosingInstance = m_prefabSystemComponent->CreatePrefab(
|
||||
{},
|
||||
MakeInstanceList( AZStd::move(nestedInstance) ),
|
||||
MakeInstanceList(AZStd::move(nestedInstance)),
|
||||
enclosingTemplatePath);
|
||||
|
||||
TemplateId templateToInstantiateId = enclosingInstance->GetTemplateId();
|
||||
@@ -99,7 +99,7 @@ namespace Benchmark
|
||||
{
|
||||
currentInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
||||
{},
|
||||
MakeInstanceList( AZStd::move(currentInstanceRoot) ),
|
||||
MakeInstanceList(AZStd::move(currentInstanceRoot)),
|
||||
m_paths[currentDepth - 1]);
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ namespace Benchmark
|
||||
{
|
||||
currentInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
||||
{},
|
||||
MakeInstanceList( AZStd::move(currentInstanceRoot) ),
|
||||
MakeInstanceList(AZStd::move(currentInstanceRoot)),
|
||||
m_paths[currentDepth]);
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@ namespace Benchmark
|
||||
|
||||
currentInstanceRoot = m_prefabSystemComponent->CreatePrefab(
|
||||
{},
|
||||
MakeInstanceList( AZStd::move(currentInstanceRoot), AZStd::move(extraNestedInstance) ),
|
||||
MakeInstanceList(AZStd::move(currentInstanceRoot), AZStd::move(extraNestedInstance)),
|
||||
m_paths[currentDepth]);
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ namespace UnitTest
|
||||
|
||||
// Create a street prefab that nests the car and sportscar instances created above. The container entity will be created as part of the process.
|
||||
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> streetInstance =
|
||||
m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList( AZStd::move(carInstance), AZStd::move(sportsCarInstance) ), "test/street");
|
||||
m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList(AZStd::move(carInstance), AZStd::move(sportsCarInstance)), "test/street");
|
||||
ASSERT_TRUE(streetInstance);
|
||||
m_instanceMap[StreetEntityName] = streetInstance.get();
|
||||
|
||||
|
||||
+1
-1
@@ -320,7 +320,7 @@ namespace UnitTest
|
||||
Instance& addedInstance = *addedInstancePtr;
|
||||
|
||||
//create a first instance where the instance will be removed
|
||||
AZStd::unique_ptr<Instance> firstInstance = m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList( AZStd::move(addedInstancePtr) ), "test/path");
|
||||
AZStd::unique_ptr<Instance> firstInstance = m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList(AZStd::move(addedInstancePtr)), "test/path");
|
||||
ASSERT_TRUE(firstInstance);
|
||||
|
||||
//get added instance alias
|
||||
|
||||
@@ -44,11 +44,11 @@ namespace UnitTest
|
||||
ASSERT_TRUE(firstInstance);
|
||||
|
||||
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> secondInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(firstInstance) ), "test/path2");
|
||||
MakeInstanceList(AZStd::move(firstInstance)), "test/path2");
|
||||
ASSERT_TRUE(secondInstance);
|
||||
|
||||
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> thirdInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(secondInstance) ), "test/path3");
|
||||
MakeInstanceList(AZStd::move(secondInstance)), "test/path3");
|
||||
ASSERT_TRUE(thirdInstance);
|
||||
|
||||
//Instantiate it
|
||||
|
||||
@@ -21,8 +21,8 @@ namespace UnitTest
|
||||
using namespace AzToolsFramework::Prefab;
|
||||
LinkData CreateLinkData(
|
||||
const InstanceData& instanceData,
|
||||
const TemplateId& sourceTemplateId,
|
||||
const TemplateId& targetTemplateId)
|
||||
TemplateId sourceTemplateId,
|
||||
TemplateId targetTemplateId)
|
||||
{
|
||||
LinkData newLinkData;
|
||||
newLinkData.m_instanceData = instanceData;
|
||||
|
||||
@@ -17,8 +17,8 @@ namespace UnitTest
|
||||
{
|
||||
LinkData CreateLinkData(
|
||||
const InstanceData& instanceData,
|
||||
const AzToolsFramework::Prefab::TemplateId& sourceTemplateId,
|
||||
const AzToolsFramework::Prefab::TemplateId& targetTemplateId);
|
||||
AzToolsFramework::Prefab::TemplateId sourceTemplateId,
|
||||
AzToolsFramework::Prefab::TemplateId targetTemplateId);
|
||||
|
||||
InstanceData CreateInstanceDataWithNoPatches(
|
||||
const AZStd::string& name,
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace UnitTest
|
||||
}
|
||||
|
||||
void ValidateInstances(
|
||||
const TemplateId& templateId,
|
||||
TemplateId templateId,
|
||||
const PrefabDomValue& expectedContent,
|
||||
const PrefabDomPath& contentPath,
|
||||
bool isContentAnInstance,
|
||||
@@ -204,7 +204,7 @@ namespace UnitTest
|
||||
}
|
||||
|
||||
void ValidateEntitiesOfInstances(
|
||||
const AzToolsFramework::Prefab::TemplateId& templateId,
|
||||
AzToolsFramework::Prefab::TemplateId templateId,
|
||||
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
||||
const AZStd::vector<EntityAlias>& entityAliases)
|
||||
{
|
||||
@@ -219,7 +219,7 @@ namespace UnitTest
|
||||
}
|
||||
|
||||
void ValidateNestedInstancesOfInstances(
|
||||
const AzToolsFramework::Prefab::TemplateId& templateId,
|
||||
AzToolsFramework::Prefab::TemplateId templateId,
|
||||
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
||||
const AZStd::vector<InstanceAlias>& nestedInstanceAliases)
|
||||
{
|
||||
|
||||
@@ -118,7 +118,7 @@ namespace UnitTest
|
||||
const PrefabDomValue& patches);
|
||||
|
||||
void ValidateInstances(
|
||||
const TemplateId& templateId,
|
||||
TemplateId templateId,
|
||||
const PrefabDomValue& expectedContent,
|
||||
const PrefabDomPath& contentPath,
|
||||
bool isContentAnInstance = false,
|
||||
@@ -147,12 +147,12 @@ namespace UnitTest
|
||||
void ComparePrefabDomValues(PrefabDomValueConstReference valueA, PrefabDomValueConstReference valueB);
|
||||
|
||||
void ValidateEntitiesOfInstances(
|
||||
const AzToolsFramework::Prefab::TemplateId& templateId,
|
||||
AzToolsFramework::Prefab::TemplateId templateId,
|
||||
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
||||
const AZStd::vector<EntityAlias>& entityAliases);
|
||||
|
||||
void ValidateNestedInstancesOfInstances(
|
||||
const AzToolsFramework::Prefab::TemplateId& templateId,
|
||||
AzToolsFramework::Prefab::TemplateId templateId,
|
||||
const AzToolsFramework::Prefab::PrefabDom& expectedPrefabDom,
|
||||
const AZStd::vector<InstanceAlias>& nestedInstanceAliases);
|
||||
|
||||
|
||||
@@ -18,14 +18,14 @@ namespace UnitTest
|
||||
{
|
||||
//create two prefabs for test
|
||||
//create prefab 1
|
||||
firstInstance = AZStd::move(m_prefabSystemComponent->CreatePrefab({ }, {}, "test/path0"));
|
||||
firstInstance = AZStd::move(m_prefabSystemComponent->CreatePrefab({}, {}, "test/path0"));
|
||||
ASSERT_TRUE(firstInstance);
|
||||
|
||||
//get template id
|
||||
ownerId = firstInstance->GetTemplateId();
|
||||
|
||||
//create prefab 2
|
||||
secondInstance = AZStd::move(m_prefabSystemComponent->CreatePrefab({ }, {}, "test/path1"));
|
||||
secondInstance = AZStd::move(m_prefabSystemComponent->CreatePrefab({}, {}, "test/path1"));
|
||||
ASSERT_TRUE(secondInstance);
|
||||
|
||||
//get template id
|
||||
|
||||
@@ -120,7 +120,7 @@ namespace UnitTest
|
||||
|
||||
// Create an enclosing Template with 0 entities and 1 nested Instance.
|
||||
AZStd::unique_ptr<Instance> nestedInstance1 = m_prefabSystemComponent->InstantiatePrefab(newNestedTemplateId);
|
||||
AZStd::unique_ptr<Instance> newEnclosingInstance = m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList( AZStd::move(nestedInstance1) ), PrefabMockFilePath);
|
||||
AZStd::unique_ptr<Instance> newEnclosingInstance = m_prefabSystemComponent->CreatePrefab({}, MakeInstanceList(AZStd::move(nestedInstance1)), PrefabMockFilePath);
|
||||
TemplateId newEnclosingTemplateId = newEnclosingInstance->GetTemplateId();
|
||||
EXPECT_TRUE(newEnclosingTemplateId != InvalidTemplateId);
|
||||
PrefabDom& newEnclosingTemplateDom = m_prefabSystemComponent->FindTemplateDom(newEnclosingTemplateId);
|
||||
@@ -284,7 +284,7 @@ namespace UnitTest
|
||||
AZStd::unique_ptr<Instance> nestedInstance2 = m_prefabSystemComponent->InstantiatePrefab(newNestedTemplateId);
|
||||
AZStd::unique_ptr<Instance> newEnclosingInstance = m_prefabSystemComponent->CreatePrefab(
|
||||
{},
|
||||
MakeInstanceList( AZStd::move(nestedInstance1), AZStd::move(nestedInstance2) ),
|
||||
MakeInstanceList(AZStd::move(nestedInstance1), AZStd::move(nestedInstance2)),
|
||||
PrefabMockFilePath);
|
||||
TemplateId newEnclosingTemplateId = newEnclosingInstance->GetTemplateId();
|
||||
EXPECT_TRUE(newEnclosingTemplateId != InvalidTemplateId);
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace UnitTest
|
||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||
AZStd::unique_ptr<Instance> wheel2UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(wheel1UnderAxle), AZStd::move(wheel2UnderAxle) ), AxlePrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(wheel1UnderAxle), AZStd::move(wheel2UnderAxle)), AxlePrefabMockFilePath);
|
||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||
@@ -51,7 +51,7 @@ namespace UnitTest
|
||||
AZStd::unique_ptr<Instance> axle2UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||
AZStd::unique_ptr<Instance> spareWheelUnderCar = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(axle1UnderCar), AZStd::move(axle2UnderCar), AZStd::move(spareWheelUnderCar) ), CarPrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(axle1UnderCar), AZStd::move(axle2UnderCar), AZStd::move(spareWheelUnderCar)), CarPrefabMockFilePath);
|
||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||
@@ -93,7 +93,7 @@ namespace UnitTest
|
||||
// Create an axle with 0 entities and 1 wheel instance.
|
||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(wheel1UnderAxle) ), AxlePrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(wheel1UnderAxle)), AxlePrefabMockFilePath);
|
||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||
AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||
@@ -105,7 +105,7 @@ namespace UnitTest
|
||||
AZStd::unique_ptr<Instance> axle1UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||
AZStd::unique_ptr<Instance> axle2UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(axle1UnderCar), AZStd::move(axle2UnderCar) ), CarPrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(axle1UnderCar), AZStd::move(axle2UnderCar)), CarPrefabMockFilePath);
|
||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||
@@ -151,7 +151,7 @@ namespace UnitTest
|
||||
// Create an axle with 0 entities and 1 wheel instance.
|
||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(wheel1UnderAxle) ), AxlePrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(wheel1UnderAxle)), AxlePrefabMockFilePath);
|
||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||
@@ -159,7 +159,7 @@ namespace UnitTest
|
||||
// Create a car with 0 entities and 1 axle instance.
|
||||
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(axleUnderCar) ), CarPrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(axleUnderCar)), CarPrefabMockFilePath);
|
||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||
@@ -205,7 +205,7 @@ namespace UnitTest
|
||||
// Create an axle with 0 entities and 1 wheel instance.
|
||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(wheel1UnderAxle) ), AxlePrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(wheel1UnderAxle)), AxlePrefabMockFilePath);
|
||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||
@@ -213,7 +213,7 @@ namespace UnitTest
|
||||
// Create a car with 0 entities and 1 axle instance.
|
||||
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(axleUnderCar) ), CarPrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(axleUnderCar)), CarPrefabMockFilePath);
|
||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||
@@ -253,7 +253,7 @@ namespace UnitTest
|
||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||
AZStd::unique_ptr<Instance> wheel2UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(wheel1UnderAxle), AZStd::move(wheel2UnderAxle) ),
|
||||
MakeInstanceList(AZStd::move(wheel1UnderAxle), AZStd::move(wheel2UnderAxle) ),
|
||||
AxlePrefabMockFilePath);
|
||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||
@@ -265,7 +265,7 @@ namespace UnitTest
|
||||
// Create a car with 0 entities and 1 axle instance.
|
||||
AZStd::unique_ptr<Instance> axle1UnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(axle1UnderCar) ), CarPrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(axle1UnderCar)), CarPrefabMockFilePath);
|
||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||
@@ -320,7 +320,7 @@ namespace UnitTest
|
||||
// Create an axle with 0 entities and 1 wheel instance.
|
||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(wheel1UnderAxle) ), AxlePrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(wheel1UnderAxle)), AxlePrefabMockFilePath);
|
||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||
@@ -328,7 +328,7 @@ namespace UnitTest
|
||||
// Create a car with 0 entities and 1 axle instance.
|
||||
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(axleUnderCar) ), CarPrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(axleUnderCar)), CarPrefabMockFilePath);
|
||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||
@@ -381,7 +381,7 @@ namespace UnitTest
|
||||
// Create an axle with 0 entities and 1 wheel instance.
|
||||
AZStd::unique_ptr<Instance> wheel1UnderAxle = m_prefabSystemComponent->InstantiatePrefab(wheelTemplateId);
|
||||
AZStd::unique_ptr<Instance> axleInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(wheel1UnderAxle) ), AxlePrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(wheel1UnderAxle)), AxlePrefabMockFilePath);
|
||||
const TemplateId axleTemplateId = axleInstance->GetTemplateId();
|
||||
PrefabDom& axleTemplateDom = m_prefabSystemComponent->FindTemplateDom(axleTemplateId);
|
||||
const AZStd::vector<InstanceAlias> wheelInstanceAliasesUnderAxle = axleInstance->GetNestedInstanceAliases(wheelTemplateId);
|
||||
@@ -389,7 +389,7 @@ namespace UnitTest
|
||||
// Create a car with 0 entities and 1 axle instance.
|
||||
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(axleUnderCar) ), CarPrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(axleUnderCar)), CarPrefabMockFilePath);
|
||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||
|
||||
@@ -68,7 +68,7 @@ namespace UnitTest
|
||||
// Create a car with 0 entities and 1 axle instance.
|
||||
AZStd::unique_ptr<Instance> axleUnderCar = m_prefabSystemComponent->InstantiatePrefab(axleTemplateId);
|
||||
AZStd::unique_ptr<Instance> carInstance = m_prefabSystemComponent->CreatePrefab({},
|
||||
MakeInstanceList( AZStd::move(axleUnderCar) ), CarPrefabMockFilePath);
|
||||
MakeInstanceList(AZStd::move(axleUnderCar)), CarPrefabMockFilePath);
|
||||
const TemplateId carTemplateId = carInstance->GetTemplateId();
|
||||
const AZStd::vector<InstanceAlias> axleInstanceAliasesUnderCar = carInstance->GetNestedInstanceAliases(axleTemplateId);
|
||||
PrefabDom& carTemplateDom = m_prefabSystemComponent->FindTemplateDom(carTemplateId);
|
||||
|
||||
@@ -558,7 +558,7 @@ namespace AZ
|
||||
AZStd::string instanceAlias = GetInstanceAlias(instance);
|
||||
|
||||
// Create a new unmodified prefab Instance for the nested slice instance.
|
||||
auto nestedInstance = AZStd::make_unique<AzToolsFramework::Prefab::Instance>();
|
||||
auto nestedInstance = AZStd::make_unique<AzToolsFramework::Prefab::Instance>(AZStd::move(instanceAlias));
|
||||
AzToolsFramework::Prefab::Instance::EntityList newEntities;
|
||||
if (!AzToolsFramework::Prefab::PrefabDomUtils::LoadInstanceFromPrefabDom(
|
||||
*nestedInstance, newEntities, nestedTemplate->get().GetPrefabDom()))
|
||||
@@ -742,7 +742,7 @@ namespace AZ
|
||||
instanceToTemplateInterface->GenerateDomForInstance(topLevelInstanceDomBefore, *topLevelInstance);
|
||||
|
||||
// Use the deterministic instance alias for this new instance
|
||||
AzToolsFramework::Prefab::Instance& addedInstance = topLevelInstance->AddInstance(AZStd::move(nestedInstance), instanceAlias);
|
||||
AzToolsFramework::Prefab::Instance& addedInstance = topLevelInstance->AddInstance(AZStd::move(nestedInstance));
|
||||
|
||||
AzToolsFramework::Prefab::PrefabDom topLevelInstanceDomAfter;
|
||||
instanceToTemplateInterface->GenerateDomForInstance(topLevelInstanceDomAfter, *topLevelInstance);
|
||||
|
||||
Reference in New Issue
Block a user