merge from development

Signed-off-by: greerdv <greerdv@amazon.com>
monroegm-disable-blank-issue-2
greerdv 4 years ago
commit ffdd3e85ac

@ -87,12 +87,18 @@ class AtomComponentProperties:
def decal(property: str = 'name') -> str: def decal(property: str = 'name') -> str:
""" """
Decal component properties. Decal component properties.
- 'Attenuation Angle' controls how much the angle between geometry and decal impacts opacity. 0-1 Radians
- 'Opacity' where one is opaque and zero is transparent
- 'Sort Key' 0-255 stacking z-sort like key to define which decal is on top of another
- 'Material' the material Asset.id of the decal. - 'Material' the material Asset.id of the decal.
:param property: From the last element of the property tree path. Default 'name' for component name string. :param property: From the last element of the property tree path. Default 'name' for component name string.
:return: Full property path OR component name if no property specified. :return: Full property path OR component name if no property specified.
""" """
properties = { properties = {
'name': 'Decal', 'name': 'Decal',
'Attenuation Angle': 'Controller|Configuration|Attenuation Angle',
'Opacity': 'Controller|Configuration|Opacity',
'Sort Key': 'Controller|Configuration|Sort Key',
'Material': 'Controller|Configuration|Material', 'Material': 'Controller|Configuration|Material',
} }
return properties[property] return properties[property]
@ -242,12 +248,14 @@ class AtomComponentProperties:
def grid(property: str = 'name') -> str: def grid(property: str = 'name') -> str:
""" """
Grid component properties. Grid component properties.
- 'Grid Size': The size of the grid, default value is 32
- 'Secondary Grid Spacing': The spacing value for the secondary grid, i.e. 1.0 - 'Secondary Grid Spacing': The spacing value for the secondary grid, i.e. 1.0
:param property: From the last element of the property tree path. Default 'name' for component name string. :param property: From the last element of the property tree path. Default 'name' for component name string.
:return: Full property path OR component name if no property specified. :return: Full property path OR component name if no property specified.
""" """
properties = { properties = {
'name': 'Grid', 'name': 'Grid',
'Grid Size': 'Controller|Configuration|Grid Size',
'Secondary Grid Spacing': 'Controller|Configuration|Secondary Grid Spacing', 'Secondary Grid Spacing': 'Controller|Configuration|Secondary Grid Spacing',
} }
return properties[property] return properties[property]
@ -378,11 +386,13 @@ class AtomComponentProperties:
def physical_sky(property: str = 'name') -> str: def physical_sky(property: str = 'name') -> str:
""" """
Physical Sky component properties. Physical Sky component properties.
- 'Sky Intensity' float that determines sky intensity value, default value is 4.
:param property: From the last element of the property tree path. Default 'name' for component name string. :param property: From the last element of the property tree path. Default 'name' for component name string.
:return: Full property path OR component name if no property specified. :return: Full property path OR component name if no property specified.
""" """
properties = { properties = {
'name': 'Physical Sky', 'name': 'Physical Sky',
'Sky Intensity': 'Controller|Configuration|Sky Intensity',
} }
return properties[property] return properties[property]

@ -114,11 +114,11 @@ def get_property(document_id, property_name):
""" """
:return: property value or invalid value if the document is not open or the property_name can't be found :return: property value or invalid value if the document is not open or the property_name can't be found
""" """
return azlmbr.atomtools.AtomToolsDocumentRequestBus(bus.Event, "GetPropertyValue", document_id, property_name) return azlmbr.materialeditor.MaterialDocumentRequestBus(bus.Event, "GetPropertyValue", document_id, property_name)
def set_property(document_id, property_name, value): def set_property(document_id, property_name, value):
azlmbr.atomtools.AtomToolsDocumentRequestBus(bus.Event, "SetPropertyValue", document_id, property_name, value) azlmbr.materialeditor.MaterialDocumentRequestBus(bus.Event, "SetPropertyValue", document_id, property_name, value)
def is_pane_visible(pane_name): def is_pane_visible(pane_name):

@ -8,49 +8,61 @@ SPDX-License-Identifier: Apache-2.0 OR MIT
class Tests: class Tests:
camera_creation = ( camera_creation = (
"Camera Entity successfully created", "Camera Entity successfully created",
"Camera Entity failed to be created") "P0: Camera Entity failed to be created")
camera_component_added = ( camera_component_added = (
"Camera component was added to entity", "Camera component was added to entity",
"Camera component failed to be added to entity") "P0: Camera component failed to be added to entity")
camera_component_check = ( camera_component_check = (
"Entity has a Camera component", "Entity has a Camera component",
"Entity failed to find Camera component") "P0: Entity failed to find Camera component")
creation_undo = ( creation_undo = (
"UNDO Entity creation success", "UNDO Entity creation success",
"UNDO Entity creation failed") "P0: UNDO Entity creation failed")
creation_redo = ( creation_redo = (
"REDO Entity creation success", "REDO Entity creation success",
"REDO Entity creation failed") "P0: REDO Entity creation failed")
decal_creation = ( decal_creation = (
"Decal Entity successfully created", "Decal Entity successfully created",
"Decal Entity failed to be created") "P0: Decal Entity failed to be created")
decal_component = ( decal_component = (
"Entity has a Decal component", "Entity has a Decal component",
"Entity failed to find Decal component") "P0: Entity failed to find Decal component")
decal_component_removed = (
"Decal component removed",
"P0: Decal component failed to be removed")
material_property_set = ( material_property_set = (
"Material property set on Decal component", "Material property set on Decal component",
"Couldn't set Material property on Decal component") "P0: Couldn't set Material property on Decal component")
attenuation_property_set = (
"Attenuation Angle property set on Decal component",
"P1: Couldn't set Attenuation Angle property on Decal component")
opacity_property_set = (
"Opacity property set on Decal component",
"P1: Coudn't set Opacity property on Decal component")
sort_key_property_set = (
"Sort Key property set on Decal component",
"P1: Couldn't set Sort Key property on Decal component")
enter_game_mode = ( enter_game_mode = (
"Entered game mode", "Entered game mode",
"Failed to enter game mode") "P0: Failed to enter game mode")
exit_game_mode = ( exit_game_mode = (
"Exited game mode", "Exited game mode",
"Couldn't exit game mode") "P0: Couldn't exit game mode")
is_visible = ( is_visible = (
"Entity is visible", "Entity is visible",
"Entity was not visible") "P0: Entity was not visible")
is_hidden = ( is_hidden = (
"Entity is hidden", "Entity is hidden",
"Entity was not hidden") "P0: Entity was not hidden")
entity_deleted = ( entity_deleted = (
"Entity deleted", "Entity deleted",
"Entity was not deleted") "P0: Entity was not deleted")
deletion_undo = ( deletion_undo = (
"UNDO deletion success", "UNDO deletion success",
"UNDO deletion failed") "P0: UNDO deletion failed")
deletion_redo = ( deletion_redo = (
"REDO deletion success", "REDO deletion success",
"REDO deletion failed") "P0: REDO deletion failed")
def AtomEditorComponents_Decal_AddedToEntity(): def AtomEditorComponents_Decal_AddedToEntity():
@ -71,14 +83,18 @@ def AtomEditorComponents_Decal_AddedToEntity():
2) Add Decal component to Decal entity. 2) Add Decal component to Decal entity.
3) UNDO the entity creation and component addition. 3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition. 4) REDO the entity creation and component addition.
5) Enter/Exit game mode. 5) Set Material property on Decal component.
6) Test IsHidden. 6) Set Attenuation Angle property on Decal component.
7) Test IsVisible. 7) Set Opacity property on Decal component
8) Set Material property on Decal component. 8) Set Sort Key property on Decal Component
9) Delete Decal entity. 9) Remove Decal component then UNDO the remove
10) UNDO deletion. 10) Enter/Exit game mode.
11) REDO deletion. 11) Test IsHidden.
12) Look for errors and asserts. 12) Test IsVisible.
13) Delete Decal entity.
14) UNDO deletion.
15) REDO deletion.
16) Look for errors and asserts.
:return: None :return: None
""" """
@ -130,42 +146,69 @@ def AtomEditorComponents_Decal_AddedToEntity():
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.creation_redo, decal_entity.exists()) Report.result(Tests.creation_redo, decal_entity.exists())
# 5. Enter/Exit game mode. # 5. Set Material property on Decal component.
decal_material_asset_path = os.path.join("materials", "decal", "airship_symbol_decal.azmaterial")
decal_material_asset = Asset.find_asset_by_path(decal_material_asset_path, False)
decal_component.set_component_property_value(AtomComponentProperties.decal('Material'), decal_material_asset.id)
get_material_property = decal_component.get_component_property_value(AtomComponentProperties.decal('Material'))
Report.result(Tests.material_property_set, get_material_property == decal_material_asset.id)
# 6. Set Attenuation Angle property on Decal component
decal_component.set_component_property_value(AtomComponentProperties.decal('Attenuation Angle'), value=0.75)
get_attenuation_property = decal_component.get_component_property_value(
AtomComponentProperties.decal('Attenuation Angle'))
Report.result(Tests.attenuation_property_set, get_attenuation_property == 0.75)
# 7. Set Opacity property on Decal component
decal_component.set_component_property_value(AtomComponentProperties.decal('Opacity'), value=0.5)
get_opacity_property = decal_component.get_component_property_value(AtomComponentProperties.decal('Opacity'))
Report.result(Tests.opacity_property_set, get_opacity_property == 0.5)
# 8. Set Sort Key property on Decal component
decal_component.set_component_property_value(AtomComponentProperties.decal('Sort Key'), value=255.0)
get_sort_key_property = decal_component.get_component_property_value(AtomComponentProperties.decal('Sort Key'))
Report.result(Tests.sort_key_property_set, get_sort_key_property == 255.0)
decal_component.set_component_property_value(AtomComponentProperties.decal('Sort Key'), value=0)
get_sort_key_property = decal_component.get_component_property_value(AtomComponentProperties.decal('Sort Key'))
Report.result(Tests.sort_key_property_set, get_sort_key_property == 0)
# 9. Remove Decal component then UNDO the remove
decal_component.remove()
general.idle_wait_frames(1)
Report.result(Tests.decal_component_removed, not decal_entity.has_component(AtomComponentProperties.decal()))
general.undo()
general.idle_wait_frames(1)
Report.result(Tests.decal_component, decal_entity.has_component(AtomComponentProperties.decal()))
# 10. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode) TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1) general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode) TestHelper.exit_game_mode(Tests.exit_game_mode)
# 6. Test IsHidden. # 11. Test IsHidden.
decal_entity.set_visibility_state(False) decal_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, decal_entity.is_hidden() is True) Report.result(Tests.is_hidden, decal_entity.is_hidden() is True)
# 7. Test IsVisible. # 12. Test IsVisible.
decal_entity.set_visibility_state(True) decal_entity.set_visibility_state(True)
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.is_visible, decal_entity.is_visible() is True) Report.result(Tests.is_visible, decal_entity.is_visible() is True)
# 8. Set Material property on Decal component. # 13. Delete Decal entity.
decal_material_asset_path = os.path.join("materials", "basic_grey.azmaterial")
decal_material_asset = Asset.find_asset_by_path(decal_material_asset_path, False)
decal_component.set_component_property_value(AtomComponentProperties.decal('Material'), decal_material_asset.id)
get_material_property = decal_component.get_component_property_value(AtomComponentProperties.decal('Material'))
Report.result(Tests.material_property_set, get_material_property == decal_material_asset.id)
# 9. Delete Decal entity.
decal_entity.delete() decal_entity.delete()
Report.result(Tests.entity_deleted, not decal_entity.exists()) Report.result(Tests.entity_deleted, not decal_entity.exists())
# 10. UNDO deletion. # 14. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, decal_entity.exists()) Report.result(Tests.deletion_undo, decal_entity.exists())
# 11. REDO deletion. # 15. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not decal_entity.exists()) Report.result(Tests.deletion_redo, not decal_entity.exists())
# 12. Look for errors and asserts. # 16. Look for errors and asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0) TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors: for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}") Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")

@ -18,6 +18,9 @@ class Tests:
grid_component_added = ( grid_component_added = (
"Entity has a Grid component", "Entity has a Grid component",
"Entity failed to find Grid component") "Entity failed to find Grid component")
grid_size = (
"Grid Size value set successfully",
"Grid Size value could not be set")
enter_game_mode = ( enter_game_mode = (
"Entered game mode", "Entered game mode",
"Failed to enter game mode") "Failed to enter game mode")
@ -59,13 +62,14 @@ def AtomEditorComponents_Grid_AddedToEntity():
2) Add a Grid component to Grid entity. 2) Add a Grid component to Grid entity.
3) UNDO the entity creation and component addition. 3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition. 4) REDO the entity creation and component addition.
5) Enter/Exit game mode. 5) Grid Size changed.
6) Test IsHidden. 6) Enter/Exit game mode.
7) Test IsVisible. 7) Test IsHidden.
8) Delete Grid entity. 8) Test IsVisible.
9) UNDO deletion. 9) Delete Grid entity.
10) REDO deletion. 10) UNDO deletion.
11) Look for errors. 11) REDO deletion.
12) Look for errors.
:return: None :return: None
""" """
@ -119,35 +123,42 @@ def AtomEditorComponents_Grid_AddedToEntity():
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.creation_redo, grid_entity.exists()) Report.result(Tests.creation_redo, grid_entity.exists())
# 5. Enter/Exit game mode. # 5. Grid Size changed
grid_component.set_component_property_value(
AtomComponentProperties.grid('Grid Size'), value=64)
current_grid_size = grid_component.get_component_property_value(
AtomComponentProperties.grid('Grid Size'))
Report.result(Tests.grid_size, current_grid_size == 64)
# 6. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode) TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1) general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode) TestHelper.exit_game_mode(Tests.exit_game_mode)
# 6. Test IsHidden. # 7. Test IsHidden.
grid_entity.set_visibility_state(False) grid_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, grid_entity.is_hidden() is True) Report.result(Tests.is_hidden, grid_entity.is_hidden() is True)
# 7. Test IsVisible. # 8. Test IsVisible.
grid_entity.set_visibility_state(True) grid_entity.set_visibility_state(True)
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.is_visible, grid_entity.is_visible() is True) Report.result(Tests.is_visible, grid_entity.is_visible() is True)
# 8. Delete Grid entity. # 9. Delete Grid entity.
grid_entity.delete() grid_entity.delete()
Report.result(Tests.entity_deleted, not grid_entity.exists()) Report.result(Tests.entity_deleted, not grid_entity.exists())
# 9. UNDO deletion. # 10. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, grid_entity.exists()) Report.result(Tests.deletion_undo, grid_entity.exists())
# 10. REDO deletion. # 11. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not grid_entity.exists()) Report.result(Tests.deletion_redo, not grid_entity.exists())
# 11. Look for errors or asserts. # 12. Look for errors or asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0) TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors: for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}") Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")

@ -68,13 +68,14 @@ def AtomEditorComponents_Light_AddedToEntity():
2) Add Light component to the Light entity. 2) Add Light component to the Light entity.
3) UNDO the entity creation and component addition. 3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition. 4) REDO the entity creation and component addition.
5) Enter/Exit game mode. 5) Cycle through all light types.
6) Test IsHidden. 6) Enter/Exit game mode.
7) Test IsVisible. 7) Test IsHidden.
8) Delete Light entity. 8) Test IsVisible.
9) UNDO deletion. 9) Delete Light entity.
10) REDO deletion. 10) UNDO deletion.
11) Look for errors. 11) REDO deletion.
12) Look for errors.
:return: None :return: None
""" """
@ -83,7 +84,7 @@ def AtomEditorComponents_Light_AddedToEntity():
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import Report, Tracer, TestHelper from editor_python_test_tools.utils import Report, Tracer, TestHelper
from Atom.atom_utils.atom_constants import AtomComponentProperties from Atom.atom_utils.atom_constants import AtomComponentProperties, LIGHT_TYPES
with Tracer() as error_tracer: with Tracer() as error_tracer:
# Test setup begins. # Test setup begins.
@ -124,35 +125,46 @@ def AtomEditorComponents_Light_AddedToEntity():
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.creation_redo, light_entity.exists()) Report.result(Tests.creation_redo, light_entity.exists())
# 5. Enter/Exit game mode. # 5. Cycle through all light types.
for light_type in LIGHT_TYPES.keys():
light_component.set_component_property_value(
AtomComponentProperties.light('Light type'), LIGHT_TYPES[light_type])
current_light_type = light_component.get_component_property_value(
AtomComponentProperties.light('Light type'))
test_light_type = (
f"Light component has {light_type} type set",
f"Light component failed to set {light_type} type")
Report.result(test_light_type, current_light_type == LIGHT_TYPES[light_type])
# 6. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode) TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1) general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode) TestHelper.exit_game_mode(Tests.exit_game_mode)
# 6. Test IsHidden. # 7. Test IsHidden.
light_entity.set_visibility_state(False) light_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, light_entity.is_hidden() is True) Report.result(Tests.is_hidden, light_entity.is_hidden() is True)
# 7. Test IsVisible. # 8. Test IsVisible.
light_entity.set_visibility_state(True) light_entity.set_visibility_state(True)
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.is_visible, light_entity.is_visible() is True) Report.result(Tests.is_visible, light_entity.is_visible() is True)
# 8. Delete Light entity. # 9. Delete Light entity.
light_entity.delete() light_entity.delete()
Report.result(Tests.entity_deleted, not light_entity.exists()) Report.result(Tests.entity_deleted, not light_entity.exists())
# 9. UNDO deletion. # 10. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, light_entity.exists()) Report.result(Tests.deletion_undo, light_entity.exists())
# 10. REDO deletion. # 11. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not light_entity.exists()) Report.result(Tests.deletion_redo, not light_entity.exists())
# 11. Look for errors asserts. # 12. Look for errors asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0) TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors: for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}") Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")

@ -27,6 +27,9 @@ class Tests:
physical_sky_component = ( physical_sky_component = (
"Entity has a Physical Sky component", "Entity has a Physical Sky component",
"Entity failed to find Physical Sky component") "Entity failed to find Physical Sky component")
sky_intensity = (
"Sky Intensity value updated successfully",
"Sky Intensity value could not be set")
enter_game_mode = ( enter_game_mode = (
"Entered game mode", "Entered game mode",
"Failed to enter game mode") "Failed to enter game mode")
@ -68,13 +71,14 @@ def AtomEditorComponents_PhysicalSky_AddedToEntity():
2) Add Physical Sky component to Physical Sky entity. 2) Add Physical Sky component to Physical Sky entity.
3) UNDO the entity creation and component addition. 3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition. 4) REDO the entity creation and component addition.
5) Enter/Exit game mode. 5) Update Sky Intensity value.
6) Test IsHidden. 6) Enter/Exit game mode.
7) Test IsVisible. 7) Test IsHidden.
8) Delete Physical Sky entity. 8) Test IsVisible.
9) UNDO deletion. 9) Delete Physical Sky entity.
10) REDO deletion. 10) UNDO deletion.
11) Look for errors and asserts. 11) REDO deletion.
12) Look for errors and asserts.
:return: None :return: None
""" """
@ -126,35 +130,42 @@ def AtomEditorComponents_PhysicalSky_AddedToEntity():
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.creation_redo, physical_sky_entity.exists()) Report.result(Tests.creation_redo, physical_sky_entity.exists())
# 5. Enter/Exit game mode. # 5. Set Sky Intensity value
physical_sky_component.set_component_property_value(
AtomComponentProperties.physical_sky('Sky Intensity'), value=2)
current_sky_intensity = physical_sky_component.get_component_property_value(
AtomComponentProperties.physical_sky('Sky Intensity'))
Report.result(Tests.sky_intensity, current_sky_intensity == 2)
# 6. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode) TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1) general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode) TestHelper.exit_game_mode(Tests.exit_game_mode)
# 6. Test IsHidden. # 7. Test IsHidden.
physical_sky_entity.set_visibility_state(False) physical_sky_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, physical_sky_entity.is_hidden() is True) Report.result(Tests.is_hidden, physical_sky_entity.is_hidden() is True)
# 7. Test IsVisible. # 8. Test IsVisible.
physical_sky_entity.set_visibility_state(True) physical_sky_entity.set_visibility_state(True)
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.is_visible, physical_sky_entity.is_visible() is True) Report.result(Tests.is_visible, physical_sky_entity.is_visible() is True)
# 8. Delete Physical Sky entity. # 9. Delete Physical Sky entity.
physical_sky_entity.delete() physical_sky_entity.delete()
Report.result(Tests.entity_deleted, not physical_sky_entity.exists()) Report.result(Tests.entity_deleted, not physical_sky_entity.exists())
# 9. UNDO deletion. # 10. UNDO deletion.
general.undo() general.undo()
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.deletion_undo, physical_sky_entity.exists()) Report.result(Tests.deletion_undo, physical_sky_entity.exists())
# 10. REDO deletion. # 11. REDO deletion.
general.redo() general.redo()
general.idle_wait_frames(1) general.idle_wait_frames(1)
Report.result(Tests.deletion_redo, not physical_sky_entity.exists()) Report.result(Tests.deletion_redo, not physical_sky_entity.exists())
# 11. Look for errors and asserts. # 12. Look for errors and asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0) TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors: for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}") Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")

@ -34,6 +34,7 @@ class EditorComponent:
EditorEntity.add_component() or Entity.add_components() or EditorEntity.get_components_of_type() EditorEntity.add_component() or Entity.add_components() or EditorEntity.get_components_of_type()
which also assigns self.id and self.type_id to the EditorComponent object. which also assigns self.id and self.type_id to the EditorComponent object.
self.type_id is the UUID for the component type as provided by an ebus call. self.type_id is the UUID for the component type as provided by an ebus call.
self.id is an azlmbr.entity.EntityComponentIdPair which contains both entity and component id's
""" """
def __init__(self, type_id: uuid): def __init__(self, type_id: uuid):
@ -270,6 +271,13 @@ class EditorComponent:
warnings.warn("disable_component is deprecated, use set_enabled(False) instead.", DeprecationWarning) warnings.warn("disable_component is deprecated, use set_enabled(False) instead.", DeprecationWarning)
editor.EditorComponentAPIBus(bus.Broadcast, "DisableComponents", [self.id]) editor.EditorComponentAPIBus(bus.Broadcast, "DisableComponents", [self.id])
def remove(self):
"""
Removes the component from its associated entity. Essentially a delete since only UNDO can return it.
:return: None
"""
editor.EditorComponentAPIBus(bus.Broadcast, "RemoveComponents", [self.id])
@staticmethod @staticmethod
def get_type_ids(component_names: list, entity_type: EditorEntityType = EditorEntityType.GAME) -> list: def get_type_ids(component_names: list, entity_type: EditorEntityType = EditorEntityType.GAME) -> list:
""" """

@ -31,11 +31,15 @@ class TestAutomation(TestAutomationBase):
def test_Multiplayer_AutoComponent_NetworkInput(self, request, workspace, editor, launcher_platform): def test_Multiplayer_AutoComponent_NetworkInput(self, request, workspace, editor, launcher_platform):
from .tests import Multiplayer_AutoComponent_NetworkInput as test_module from .tests import Multiplayer_AutoComponent_NetworkInput as test_module
self._run_prefab_test(request, workspace, editor, test_module) self._run_prefab_test(request, workspace, editor, test_module)
def test_Multiplayer_AutoComponent_RPC(self, request, workspace, editor, launcher_platform): def test_Multiplayer_AutoComponent_RPC(self, request, workspace, editor, launcher_platform):
from .tests import Multiplayer_AutoComponent_RPC as test_module from .tests import Multiplayer_AutoComponent_RPC as test_module
self._run_prefab_test(request, workspace, editor, test_module) self._run_prefab_test(request, workspace, editor, test_module)
def test_Multiplayer_BasicConnectivity_Connects(self, request, workspace, editor, launcher_platform):
from .tests import Multiplayer_BasicConnectivity_Connects as test_module
self._run_prefab_test(request, workspace, editor, test_module)
def test_Multiplayer_SimpleNetworkLevelEntity(self, request, workspace, editor, launcher_platform): def test_Multiplayer_SimpleNetworkLevelEntity(self, request, workspace, editor, launcher_platform):
from .tests import Multiplayer_SimpleNetworkLevelEntity as test_module from .tests import Multiplayer_SimpleNetworkLevelEntity as test_module
self._run_prefab_test(request, workspace, editor, test_module) self._run_prefab_test(request, workspace, editor, test_module)

@ -62,17 +62,31 @@ def Multiplayer_AutoComponent_RPC():
Report.critical_result(TestSuccessFailTuples.find_network_player, player_id.IsValid()) Report.critical_result(TestSuccessFailTuples.find_network_player, player_id.IsValid())
# 4) Check the editor logs for expected and unexpected log output # 4) Check the editor logs for expected and unexpected log output
# Authority->Autonomous RPC
PLAYERID_RPC_WAIT_TIME_SECONDS = 1.0 # The player id is sent from the server as soon as the player script is spawned. 1 second should be more than enough time to send/receive that RPC. PLAYERID_RPC_WAIT_TIME_SECONDS = 1.0 # The player id is sent from the server as soon as the player script is spawned. 1 second should be more than enough time to send/receive that RPC.
helper.succeed_if_log_line_found('EditorServer', 'Script: AutoComponent_RPC: Sending client PlayerNumber 1', section_tracer.prints, PLAYERID_RPC_WAIT_TIME_SECONDS) helper.succeed_if_log_line_found('EditorServer', 'Script: AutoComponent_RPC: Sending client PlayerNumber 1', section_tracer.prints, PLAYERID_RPC_WAIT_TIME_SECONDS)
helper.succeed_if_log_line_found('Script', "AutoComponent_RPC: I'm Player #1", section_tracer.prints, PLAYERID_RPC_WAIT_TIME_SECONDS) helper.succeed_if_log_line_found('Script', "AutoComponent_RPC: I'm Player #1", section_tracer.prints, PLAYERID_RPC_WAIT_TIME_SECONDS)
# Uncomment once editor game-play mode supports level entities with net-binding # Authority->Client RPC
#PLAYFX_RPC_WAIT_TIME_SECONDS = 1.1 # The server will send an RPC to play an fx on the client every second. PLAYFX_RPC_WAIT_TIME_SECONDS = 1.1 # The server will send an RPC to play an fx on the client every second.
#helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity Activated on entity: NetLevelEntity", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS) helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity Activated on entity: NetLevelEntity", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
#helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity: Authority sending RPC to play some fx.", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS) helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity: Authority sending RPC to play some fx.", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
#helper.succeed_if_log_line_found('Script', "AutoComponent_RPC_NetLevelEntity: I'm a client playing some superficial fx.", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS) helper.succeed_if_log_line_found('Script', "AutoComponent_RPC_NetLevelEntity: I'm a client playing some fx.", section_tracer.prints, PLAYFX_RPC_WAIT_TIME_SECONDS)
# Autonomous->Authority RPC
# Sending 2 RPCs: 1 containing a parameter and 1 without
AUTONOMOUS_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS = 1.0 # This RPC is sent as soon as the autonomous player script is spawned. 1 second should be more than enough time to send/receive that RPC.
helper.succeed_if_log_line_found('Script', "AutoComponent_RPC: Sending AutonomousToAuthorityNoParam RPC.", section_tracer.prints, AUTONOMOUS_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
helper.succeed_if_log_line_found('Script', "AutoComponent_RPC: Sending AutonomousToAuthority RPC (with float param).", section_tracer.prints, AUTONOMOUS_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC: Successfully received AutonomousToAuthorityNoParams RPC.", section_tracer.prints, AUTONOMOUS_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC: Successfully received AutonomousToAuthority RPC (with expected float param).", section_tracer.prints, AUTONOMOUS_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
# Server->Authority RPC. Inter-Entity Communication.
SERVER_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS = 1.0 # This RPC is sent as soon as the networked level entity finds the player in the level, and previous tests are relying on the player's existence. 1 second should be more than enough time to send/receive that RPC.
helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC_NetLevelEntity: Send ServerToAuthority RPC.", section_tracer.prints, SERVER_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
helper.succeed_if_log_line_found('EditorServer', "Script: AutoComponent_RPC: Received ServerToAuthority RPC. Damage=42.", section_tracer.prints, SERVER_TO_AUTHORITY_RPC_WAIT_TIME_SECONDS)
# Exit game mode # Exit game mode
helper.exit_game_mode(TestSuccessFailTuples.exit_game_mode) helper.exit_game_mode(TestSuccessFailTuples.exit_game_mode)

@ -0,0 +1,66 @@
"""
Copyright (c) Contributors to the Open 3D Engine Project.
For complete copyright and license terms please see the LICENSE at the root of this distribution.
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
# Test Case Title : Check that the basic client connect test works
# fmt: off
class TestConstants:
enter_game_mode = ("Entered game mode", "Failed to enter game mode")
exit_game_mode = ("Exited game mode", "Couldn't exit game mode")
find_network_player = ("Found network player", "Couldn't find network player")
# fmt: on
def Multiplayer_BasicConnectivity_Connects():
r"""
Summary:
Runs a test to make sure that a networked player can be spawned
Level Description:
- Dynamic
1. Although the level is empty, when the server and editor connect the server will spawn the player prefab.
- Static
1. This is an empty level.
Expected Outcome:
We should see the player connect and spawn with no errors.
:return:
"""
import azlmbr.legacy.general as general
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import Tracer
from editor_python_test_tools.utils import TestHelper as helper
level_name = "BasicConnectivity_Connects"
player_prefab_name = "Player"
player_prefab_path = f"levels/multiplayer/{level_name}/{player_prefab_name}.network.spawnable"
helper.init_idle()
# 1) Open Level
helper.open_level("Multiplayer", level_name)
with Tracer() as section_tracer:
# 2) Enter game mode
helper.multiplayer_enter_game_mode(TestConstants.enter_game_mode, player_prefab_path.lower())
# 3) Make sure the network player was spawned
player_id = general.find_game_entity(player_prefab_name)
Report.critical_result(TestConstants.find_network_player, player_id.IsValid())
# Exit game mode
helper.exit_game_mode(TestConstants.exit_game_mode)
if __name__ == "__main__":
from editor_python_test_tools.utils import Report
Report.start_test(Multiplayer_BasicConnectivity_Connects)

@ -4,6 +4,7 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
class HeightTests: class HeightTests:
single_gradient_height_correct = ( single_gradient_height_correct = (
"Successfully retrieved height for gradient1.", "Successfully retrieved height for gradient1.",
@ -22,6 +23,7 @@ class HeightTests:
"OnTerrainDataChanged call count incorrect." "OnTerrainDataChanged call count incorrect."
) )
def TerrainHeightGradientList_AddRemoveGradientWorks(): def TerrainHeightGradientList_AddRemoveGradientWorks():
""" """
Summary: Summary:
@ -29,22 +31,16 @@ def TerrainHeightGradientList_AddRemoveGradientWorks():
:return: None :return: None
""" """
import os
import math as sys_math import math as sys_math
import azlmbr.legacy.general as general import azlmbr.legacy.general as general
import azlmbr.bus as bus import azlmbr.bus as bus
import azlmbr.math as math import azlmbr.math as math
import azlmbr.terrain as terrain import azlmbr.terrain as terrain
import azlmbr.editor as editor
import azlmbr.vegetation as vegetation
import azlmbr.entity as EntityId
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import TestHelper as helper
import editor_python_test_tools.pyside_utils as pyside_utils
from editor_python_test_tools.editor_entity_utils import EditorEntity
terrain_changed_call_count = 0 terrain_changed_call_count = 0
expected_terrain_changed_calls = 0 expected_terrain_changed_calls = 0
@ -87,11 +83,8 @@ def TerrainHeightGradientList_AddRemoveGradientWorks():
Report.result(test_results, sys_math.isclose(height, expected_height, abs_tol=test_tolerance)) Report.result(test_results, sys_math.isclose(height, expected_height, abs_tol=test_tolerance))
helper.init_idle()
# Open a level. # Open a level.
helper.open_level("Physics", "Base") hydra.open_base_level()
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
general.idle_wait_frames(1) general.idle_wait_frames(1)
@ -101,7 +94,7 @@ def TerrainHeightGradientList_AddRemoveGradientWorks():
aabb_height = 1024.0 aabb_height = 1024.0
box_dimensions = math.Vector3(1.0, 1.0, aabb_height); box_dimensions = math.Vector3(1.0, 1.0, aabb_height);
# Create a main entity with a LayerSpawner, AAbb and HeightGradientList. # Create a main entity with a LayerSpawner, AAbb and HeightGradientList.
main_entity = create_entity_at("entity2", [layerspawner_component_name, gradientlist_component_name, aabb_component_name], 0.0, 0.0, aabb_height/2.0) main_entity = create_entity_at("entity2", [layerspawner_component_name, gradientlist_component_name, aabb_component_name], 0.0, 0.0, aabb_height/2.0)
# Create three gradient entities. # Create three gradient entities.
@ -138,7 +131,8 @@ def TerrainHeightGradientList_AddRemoveGradientWorks():
# Add gradient3, the height should still be the second value, as that was the highest. # Add gradient3, the height should still be the second value, as that was the highest.
set_gradients_check_height(main_entity, [gradient_entity1.id, gradient_entity2.id, gradient_entity3.id], aabb_height * gradient_values[1], HeightTests.triple_gradient_height_correct) set_gradients_check_height(main_entity, [gradient_entity1.id, gradient_entity2.id, gradient_entity3.id], aabb_height * gradient_values[1], HeightTests.triple_gradient_height_correct)
if __name__ == "__main__": if __name__ == "__main__":
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report
Report.start_test(TerrainHeightGradientList_AddRemoveGradientWorks) Report.start_test(TerrainHeightGradientList_AddRemoveGradientWorks)

@ -4,6 +4,7 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
class MacroMaterialTests: class MacroMaterialTests:
setup_test = ( setup_test = (
"Setup successful", "Setup successful",
@ -30,6 +31,7 @@ class MacroMaterialTests:
"Timed out waiting for OnTerrainMacroMaterialRegionChanged" "Timed out waiting for OnTerrainMacroMaterialRegionChanged"
) )
def TerrainMacroMaterialComponent_MacroMaterialActivates(): def TerrainMacroMaterialComponent_MacroMaterialActivates():
""" """
Summary: Summary:
@ -38,7 +40,6 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
""" """
import os import os
import math as sys_math
import azlmbr.legacy.general as general import azlmbr.legacy.general as general
import azlmbr.asset as asset import azlmbr.asset as asset
@ -46,15 +47,11 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
import azlmbr.math as math import azlmbr.math as math
import azlmbr.terrain as terrain import azlmbr.terrain as terrain
import azlmbr.editor as editor import azlmbr.editor as editor
import azlmbr.vegetation as vegetation
import azlmbr.entity as EntityId
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import TestHelper as helper
import editor_python_test_tools.pyside_utils as pyside_utils
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.asset_utils import Asset
material_created_called = False material_created_called = False
material_changed_called = False material_changed_called = False
@ -84,11 +81,8 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
nonlocal material_destroyed_called nonlocal material_destroyed_called
material_destroyed_called = True material_destroyed_called = True
helper.init_idle()
# Open a level. # Open a level.
helper.open_level("Physics", "Base") hydra.open_base_level()
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
general.idle_wait_frames(1) general.idle_wait_frames(1)
@ -160,7 +154,8 @@ def TerrainMacroMaterialComponent_MacroMaterialActivates():
region_changed_call_result = helper.wait_for_condition(lambda: material_region_changed_called == True, 2.0) region_changed_call_result = helper.wait_for_condition(lambda: material_region_changed_called == True, 2.0)
Report.result(MacroMaterialTests.material_changed_call_on_aabb_change, region_changed_call_result) Report.result(MacroMaterialTests.material_changed_call_on_aabb_change, region_changed_call_result)
if __name__ == "__main__": if __name__ == "__main__":
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report
Report.start_test(TerrainMacroMaterialComponent_MacroMaterialActivates) Report.start_test(TerrainMacroMaterialComponent_MacroMaterialActivates)

@ -5,8 +5,9 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
#fmt: off #fmt: off
class Tests(): class Tests:
create_test_entity = ("Entity created successfully", "Failed to create Entity") create_test_entity = ("Entity created successfully", "Failed to create Entity")
add_axis_aligned_box_shape = ("Axis Aligned Box Shape component added", "Failed to add Axis Aligned Box Shape component") add_axis_aligned_box_shape = ("Axis Aligned Box Shape component added", "Failed to add Axis Aligned Box Shape component")
add_terrain_collider = ("Terrain Physics Heightfield Collider component added", "Failed to add a Terrain Physics Heightfield Collider component") add_terrain_collider = ("Terrain Physics Heightfield Collider component added", "Failed to add a Terrain Physics Heightfield Collider component")
@ -14,6 +15,7 @@ class Tests():
configuration_changed = ("Terrain size changed successfully", "Failed terrain size change") configuration_changed = ("Terrain size changed successfully", "Failed terrain size change")
#fmt: on #fmt: on
def TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges(): def TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges():
""" """
Summary: Summary:
@ -36,24 +38,24 @@ def TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges():
:return: None :return: None
""" """
import editor_python_test_tools.hydra_editor_utils as hydra
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import TestHelper as helper
from editor_python_test_tools.utils import Report, Tracer from editor_python_test_tools.utils import Report, Tracer
import azlmbr.legacy.general as general
import azlmbr.physics as physics import azlmbr.physics as physics
import azlmbr.math as azmath import azlmbr.math as azmath
import azlmbr.bus as bus import azlmbr.bus as bus
import sys
import math import math
SET_BOX_X_SIZE = 5.0 SET_BOX_X_SIZE = 5.0
SET_BOX_Y_SIZE = 6.0 SET_BOX_Y_SIZE = 6.0
EXPECTED_COLUMN_SIZE = SET_BOX_X_SIZE + 1 EXPECTED_COLUMN_SIZE = SET_BOX_X_SIZE + 1
EXPECTED_ROW_SIZE = SET_BOX_Y_SIZE + 1 EXPECTED_ROW_SIZE = SET_BOX_Y_SIZE + 1
helper.init_idle()
# 1) Load the level # 1) Load the level
helper.open_level("", "Base") hydra.open_base_level()
# 2) Create test entity # 2) Create test entity
test_entity = EditorEntity.create_editor_entity("TestEntity") test_entity = EditorEntity.create_editor_entity("TestEntity")

@ -54,7 +54,6 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
""" """
import os import os
import sys
import math as sys_math import math as sys_math
import azlmbr.legacy.general as general import azlmbr.legacy.general as general
@ -62,10 +61,8 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
import azlmbr.math as math import azlmbr.math as math
import azlmbr.areasystem as areasystem import azlmbr.areasystem as areasystem
import azlmbr.editor as editor
import azlmbr.vegetation as vegetation import azlmbr.vegetation as vegetation
import azlmbr.terrain as terrain import azlmbr.terrain as terrain
import azlmbr.entity as EntityId
import azlmbr.surface_data as surface_data import azlmbr.surface_data as surface_data
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
@ -86,11 +83,8 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
return highest_z, lowest_z return highest_z, lowest_z
helper.init_idle()
# Open an empty level. # Open an empty level.
helper.open_level("Physics", "Base") hydra.open_base_level()
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
general.idle_wait_frames(1) general.idle_wait_frames(1)
@ -208,7 +202,8 @@ def TerrainSystem_VegetationSpawnsOnTerrainSurfaces():
Report.result(VegetationTests.testTag3_excluded_vegetation_z_correct, highest_z < box_height * gradient_value_2) Report.result(VegetationTests.testTag3_excluded_vegetation_z_correct, highest_z < box_height * gradient_value_2)
if __name__ == "__main__": if __name__ == "__main__":
from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import Report
Report.start_test(TerrainSystem_VegetationSpawnsOnTerrainSurfaces) Report.start_test(TerrainSystem_VegetationSpawnsOnTerrainSurfaces)

@ -5,8 +5,9 @@ For complete copyright and license terms please see the LICENSE at the root of t
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
#fmt: off #fmt: off
class Tests(): class Tests:
create_terrain_spawner_entity = ("Terrain_spawner_entity created successfully", "Failed to create terrain_spawner_entity") create_terrain_spawner_entity = ("Terrain_spawner_entity created successfully", "Failed to create terrain_spawner_entity")
create_height_provider_entity = ("Height_provider_entity created successfully", "Failed to create height_provider_entity") create_height_provider_entity = ("Height_provider_entity created successfully", "Failed to create height_provider_entity")
create_test_ball = ("Ball created successfully", "Failed to create Ball") create_test_ball = ("Ball created successfully", "Failed to create Ball")
@ -19,6 +20,7 @@ class Tests():
no_errors_and_warnings_found = ("No errors and warnings found", "Found errors and warnings") no_errors_and_warnings_found = ("No errors and warnings found", "Found errors and warnings")
#fmt: on #fmt: on
def Terrain_SupportsPhysics(): def Terrain_SupportsPhysics():
""" """
Summary: Summary:
@ -46,8 +48,7 @@ def Terrain_SupportsPhysics():
:return: None :return: None
""" """
from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.utils import TestHelper as helper
from editor_python_test_tools.utils import TestHelper as helper, Report
from editor_python_test_tools.utils import Report, Tracer from editor_python_test_tools.utils import Report, Tracer
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
import azlmbr.math as azmath import azlmbr.math as azmath
@ -59,12 +60,9 @@ def Terrain_SupportsPhysics():
SET_BOX_X_SIZE = 1024.0 SET_BOX_X_SIZE = 1024.0
SET_BOX_Y_SIZE = 1024.0 SET_BOX_Y_SIZE = 1024.0
SET_BOX_Z_SIZE = 100.0 SET_BOX_Z_SIZE = 100.0
helper.init_idle()
# 1) Load the level # 1) Load the level
helper.open_level("", "Base") hydra.open_base_level()
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
#1a) Load the level components #1a) Load the level components
hydra.add_level_component("Terrain World") hydra.add_level_component("Terrain World")

@ -47,8 +47,8 @@ def Terrain_World_ConfigurationWorks():
12) Check terrain does not exist at a known position outside the world 12) Check terrain does not exist at a known position outside the world
13) Check height value is the expected one when query resolution is changed 13) Check height value is the expected one when query resolution is changed
""" """
from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import TestHelper as helper, Report from editor_python_test_tools.utils import TestHelper as helper
from editor_python_test_tools.utils import Report, Tracer from editor_python_test_tools.utils import Report, Tracer
import editor_python_test_tools.hydra_editor_utils as hydra import editor_python_test_tools.hydra_editor_utils as hydra
import azlmbr.math as azmath import azlmbr.math as azmath
@ -62,14 +62,11 @@ def Terrain_World_ConfigurationWorks():
SET_BOX_Y_SIZE = 2048.0 SET_BOX_Y_SIZE = 2048.0
SET_BOX_Z_SIZE = 100.0 SET_BOX_Z_SIZE = 100.0
CLAMP = 1 CLAMP = 1
helper.init_idle()
# 1) Start the Tracer to catch any errors and warnings # 1) Start the Tracer to catch any errors and warnings
with Tracer() as section_tracer: with Tracer() as section_tracer:
# 2) Load the level # 2) Load the level
helper.open_level("", "Base") hydra.open_base_level()
helper.wait_for_condition(lambda: general.get_current_level_name() == "Base", 2.0)
# 3) Load the level components # 3) Load the level components
terrain_world_component = hydra.add_level_component("Terrain World") terrain_world_component = hydra.add_level_component("Terrain World")

@ -3,25 +3,18 @@ Copyright (c) Contributors to the Open 3D Engine Project.
For complete copyright and license terms please see the LICENSE at the root of this distribution. For complete copyright and license terms please see the LICENSE at the root of this distribution.
SPDX-License-Identifier: Apache-2.0 OR MIT SPDX-License-Identifier: Apache-2.0 OR MIT
""" """
# This suite consists of all test cases that are passing and have been verified.
import pytest import pytest
import os
import sys
from ly_test_tools import LAUNCHERS
from ly_test_tools.o3de.editor_test import EditorTestSuite, EditorSharedTest from ly_test_tools.o3de.editor_test import EditorTestSuite, EditorSharedTest
@pytest.mark.SUITE_main @pytest.mark.SUITE_main
@pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("launcher_platform", ['windows_editor'])
@pytest.mark.parametrize("project", ["AutomatedTesting"]) @pytest.mark.parametrize("project", ["AutomatedTesting"])
class TestAutomation(EditorTestSuite): class TestAutomation(EditorTestSuite):
enable_prefab_system = False
class test_AxisAlignedBoxShape_ConfigurationWorks(EditorSharedTest): class test_AxisAlignedBoxShape_ConfigurationWorks(EditorSharedTest):
from .EditorScripts import TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges as test_module from .EditorScripts import TerrainPhysicsCollider_ChangesSizeWithAxisAlignedBoxShapeChanges as test_module

@ -242,7 +242,7 @@ Node Type: BoneData
BasisX: < 1.000000, -0.000000, 0.000000> BasisX: < 1.000000, -0.000000, 0.000000>
BasisY: < 0.000000, 1.000000, 0.000000> BasisY: < 0.000000, 1.000000, 0.000000>
BasisZ: <-0.000000, -0.000000, 1.000000> BasisZ: <-0.000000, -0.000000, 1.000000>
Transl: < 0.152547, 0.043345, 0.090954> Transl: < 0.152547, 0.043345, 0.090955>
Node Name: animation Node Name: animation
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.animation
@ -544,7 +544,7 @@ Node Type: BoneData
Node Name: animation Node Name: animation
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_upArmRoll.animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_upArmRoll.animation
Node Type: AnimationData Node Type: AnimationData
KeyFrames: Count 195. Hash: 8781707605519483934 KeyFrames: Count 195. Hash: 15529789169672670472
TimeStepBetweenFrames: 0.033333 TimeStepBetweenFrames: 0.033333
Node Name: transform Node Name: transform
@ -710,7 +710,7 @@ Node Type: BoneData
BasisX: < 0.514369, 0.855813, 0.054857> BasisX: < 0.514369, 0.855813, 0.054857>
BasisY: < 0.088153, 0.010863, -0.996047> BasisY: < 0.088153, 0.010863, -0.996047>
BasisZ: <-0.853026, 0.517172, -0.069855> BasisZ: <-0.853026, 0.517172, -0.069855>
Transl: <-0.247306, -0.062325, 0.878372> Transl: <-0.247306, -0.062325, 0.878373>
Node Name: animation Node Name: animation
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_loArmRoll.animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_loArmRoll.animation
@ -857,7 +857,7 @@ Node Type: BoneData
BasisX: < 0.329257, 0.944038, -0.019538> BasisX: < 0.329257, 0.944038, -0.019538>
BasisY: < 0.465563, -0.180309, -0.866452> BasisY: < 0.465563, -0.180309, -0.866452>
BasisZ: <-0.821487, 0.276189, -0.498877> BasisZ: <-0.821487, 0.276189, -0.498877>
Transl: <-0.255124, -0.049696, 0.794466> Transl: <-0.255124, -0.049696, 0.794467>
Node Name: animation Node Name: animation
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_loArm.l_hand.l_metacarpal.animation
@ -953,7 +953,7 @@ Node Type: BoneData
BasisX: <-0.102387, -0.418082, -0.902621> BasisX: <-0.102387, -0.418082, -0.902621>
BasisY: < 0.928150, 0.286271, -0.237880> BasisY: < 0.928150, 0.286271, -0.237880>
BasisZ: < 0.357847, -0.862123, 0.358732> BasisZ: < 0.357847, -0.862123, 0.358732>
Transl: < 0.187367, 0.698323, 1.467209> Transl: < 0.187367, 0.698324, 1.467209>
Node Name: animation Node Name: animation
Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.animation

@ -114,7 +114,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483544 -0.3849890 0.9218784 -0.0438619 0.0277800 0.0590787 0.9978667 -0.0995240 0.0035963 0.9837443" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483544 -0.3849890 0.9218784 -0.0438619 0.0277800 0.0590787 0.9978667 -0.0995240 0.0035963 0.9837442" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -191,7 +191,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483544 -0.3849890 0.9218784 -0.0438619 0.0277800 0.0590787 0.9978667 -0.1057190 -0.0095780 0.7612199" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483544 -0.3849890 0.9218784 -0.0438619 0.0277800 0.0590787 0.9978667 -0.1057190 -0.0095780 0.7612200" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -204,7 +204,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483545 -0.3857441 0.9101822 -0.1508971 -0.0137745 0.1578555 0.9873661 -0.1119141 -0.0227522 0.5386958" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9225030 0.3829492 -0.0483545 -0.3857441 0.9101822 -0.1508971 -0.0137745 0.1578555 0.9873661 -0.1119141 -0.0227522 0.5386957" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -268,7 +268,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9918931 -0.1127676 0.0585800 0.1181807 0.9880368 -0.0990792 -0.0467063 0.1051989 0.9933537 0.1314755 0.0908038 0.5390974" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9918931 -0.1127676 0.0585800 0.1181807 0.9880368 -0.0990792 -0.0467063 0.1051989 0.9933537 0.1314754 0.0908038 0.5390974" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -319,7 +319,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.9846771 -0.1743657 -0.0027636 -0.0040787 0.0071844 0.9999658 -0.1743399 0.9846547 -0.0077855 -0.0024987 0.0198645 1.2316585" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.9846771 -0.1743657 -0.0027636 -0.0040787 0.0071844 0.9999658 -0.1743399 0.9846547 -0.0077855 -0.0024987 0.0198645 1.2316583" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -408,7 +408,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9636059 0.2673270 0.0000002 -0.2673270 0.9636059 0.0000004 -0.0000001 -0.0000005 0.9999999 -0.1057001 -0.0939669 0.0932542" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9636059 0.2673270 0.0000002 -0.2673270 0.9636059 0.0000004 -0.0000001 -0.0000005 0.9999999 -0.1057001 -0.0939668 0.0932542" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -497,7 +497,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="1.0000000 -0.0000001 0.0000001 0.0000001 1.0000000 0.0000005 -0.0000001 -0.0000005 1.0000000 0.1525467 0.0433452 0.0909544" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="1.0000000 -0.0000001 0.0000001 0.0000001 1.0000000 0.0000005 -0.0000001 -0.0000005 1.0000000 0.1525467 0.0433452 0.0909545" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -548,7 +548,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.9795371 -0.2012138 -0.0044671 0.0088889 -0.0654249 0.9978178 -0.2010670 0.9773599 0.0658747 -0.0031105 0.0209422 1.3816533" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.9795371 -0.2012138 -0.0044671 0.0088889 -0.0654249 0.9978178 -0.2010670 0.9773599 0.0658747 -0.0031105 0.0209422 1.3816534" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -650,7 +650,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="1.0000000 -0.0000001 0.0000001 0.0000001 1.0000000 0.0000005 -0.0000001 -0.0000005 1.0000000 0.1525467 0.1935186 0.0237662" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="1.0000000 -0.0000001 0.0000001 0.0000001 1.0000000 0.0000005 -0.0000001 -0.0000005 1.0000000 0.1525467 0.1935186 0.0237663" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -701,7 +701,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.9948647 -0.0988443 0.0217715 0.0113319 0.1049736 0.9944103 -0.1005772 0.9895505 -0.1033145 -0.0014216 0.0085115 1.5712386" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.9948647 -0.0988443 0.0217715 0.0113319 0.1049736 0.9944103 -0.1005772 0.9895505 -0.1033145 -0.0014216 0.0085115 1.5712385" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -727,7 +727,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3913002 -0.9108952 0.1309726 -0.9019646 -0.4078557 -0.1418229 0.1826037 -0.0626373 -0.9811893 0.0803188 0.0196155 1.4967986" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3913002 -0.9108952 0.1309726 -0.9019646 -0.4078557 -0.1418229 0.1826037 -0.0626373 -0.9811893 0.0803188 0.0196155 1.4967985" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -854,7 +854,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.9994818 -0.0310398 -0.0085214 -0.0078972 -0.0201766 0.9997651 -0.0312043 0.9993144 0.0199210 -0.0020550 0.0351172 1.6630899" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.9994818 -0.0310398 -0.0085214 -0.0078972 -0.0201766 0.9997651 -0.0312043 0.9993144 0.0199210 -0.0020550 0.0351172 1.6630900" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -905,7 +905,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.1350640 0.9784527 -0.1561655 0.9639030 0.0932519 -0.2493893 -0.2294530 -0.1842118 -0.9557285 -0.1881499 -0.0555908 1.4517218" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.1350640 0.9784527 -0.1561655 0.9639030 0.0932519 -0.2493893 -0.2294530 -0.1842118 -0.9557285 -0.1881499 -0.0555909 1.4517218" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1109,7 +1109,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0534004 -0.3009000 -0.9521595 -0.9985610 0.0208024 0.0494289 0.0049341 0.9534288 -0.3015778 0.1978613 0.1747155 1.4348212" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0534004 -0.3009000 -0.9521595 -0.9985610 0.0208024 0.0494289 0.0049341 0.9534288 -0.3015778 0.1978613 0.1747155 1.4348211" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1141,7 +1141,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="KeyFrames - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="KeyFrames - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="8781707605519483934" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="15529789169672670472" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1415,7 +1415,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2565261 0.2200654 -0.9411510 0.0032468 0.9735332 0.2285221 -0.2390312 -0.0175187 0.9024240" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2565261 0.2200654 -0.9411510 0.0032468 0.9735332 0.2285221 -0.2390311 -0.0175187 0.9024240" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1441,7 +1441,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.1345730 -0.0673964 -0.9886089 -0.9346014 0.3228769 -0.1492327 -0.2613609 -0.0465721 0.8402831" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.1345730 -0.0673964 -0.9886089 -0.9346014 0.3228769 -0.1492327 -0.2613609 -0.0465721 0.8402832" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1454,7 +1454,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.5215136 0.8398412 -0.1506330 -0.0192358 -0.1649243 -0.9861184 -0.8530262 0.5171716 -0.0698552 -0.2693057 -0.0706829 0.8937123" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.5215136 0.8398412 -0.1506330 -0.0192358 -0.1649243 -0.9861184 -0.8530262 0.5171716 -0.0698552 -0.2693058 -0.0706829 0.8937123" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1467,7 +1467,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.5143689 0.8558125 0.0548569 0.0881534 0.0108630 -0.9960474 -0.8530262 0.5171716 -0.0698552 -0.2473062 -0.0623250 0.8783725" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.5143689 0.8558125 0.0548569 0.0881534 0.0108630 -0.9960474 -0.8530262 0.5171716 -0.0698552 -0.2473062 -0.0623250 0.8783726" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1569,7 +1569,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0802934 -0.4308499 -0.8988443 0.5990614 -0.7415851 0.3019556 -0.7966672 -0.5142179 0.3176499 0.2168119 0.6618763 1.4820503" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0802934 -0.4308499 -0.8988443 0.5990614 -0.7415851 0.3019556 -0.7966672 -0.5142179 0.3176499 0.2168119 0.6618764 1.4820503" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1582,7 +1582,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0260422 -0.4643564 -0.8852653 0.9706670 -0.2234796 0.0886692 -0.2390129 -0.8569889 0.4565554 0.2131762 0.6597862 1.4626874" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0260422 -0.4643564 -0.8852653 0.9706670 -0.2234796 0.0886692 -0.2390129 -0.8569889 0.4565554 0.2131762 0.6597863 1.4626874" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1608,7 +1608,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.0557957 -0.0005854 -0.9984418 -0.9981855 -0.0227144 -0.0557681 -0.0226463 0.9997417 -0.0018517 0.1809568 0.7018137 1.4945196" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.0557957 -0.0005854 -0.9984418 -0.9981855 -0.0227144 -0.0557681 -0.0226463 0.9997417 -0.0018517 0.1809568 0.7018138 1.4945196" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1659,7 +1659,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2373489 -0.1534441 -0.9592289 0.0973740 0.9862305 -0.1336694 -0.2288372 -0.0087736 0.8650238" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2373489 -0.1534441 -0.9592289 0.0973740 0.9862305 -0.1336694 -0.2288371 -0.0087736 0.8650237" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1710,7 +1710,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3615634 0.9298344 0.0684081 0.4901183 -0.1271389 -0.8623338 -0.7931304 0.3453165 -0.5016975 -0.2471175 -0.0273644 0.7929417" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3615634 0.9298344 0.0684081 0.4901183 -0.1271389 -0.8623338 -0.7931304 0.3453165 -0.5016975 -0.2471175 -0.0273644 0.7929418" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1761,7 +1761,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.4655626 -0.1803091 -0.8664525 -0.8214875 0.2761891 -0.4988768 -0.2551242 -0.0496955 0.7944664" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.4655626 -0.1803091 -0.8664525 -0.8214875 0.2761891 -0.4988768 -0.2551242 -0.0496955 0.7944666" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1812,7 +1812,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.1359657 -0.1081222 -0.9847956 -0.9245527 0.3433140 -0.1653412 -0.2679712 -0.0667890 0.8432873" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.1359657 -0.1081222 -0.9847956 -0.9245527 0.3433140 -0.1653412 -0.2679712 -0.0667891 0.8432874" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1825,7 +1825,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.2697999 -0.2777221 -0.9219966 -0.9092504 0.2417132 -0.3388780 -0.2744931 -0.0856099 0.8500432" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.2697999 -0.2777221 -0.9219966 -0.9092504 0.2417132 -0.3388780 -0.2744932 -0.0856099 0.8500431" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1914,7 +1914,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.0052020 0.3264090 0.9452143 0.5280435 -0.8035957 0.2745980 0.8492015 0.4976858 -0.1765385 0.1653490 0.6116705 1.5069345" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.0052020 0.3264090 0.9452143 0.5280435 -0.8035957 0.2745980 0.8492015 0.4976858 -0.1765385 0.1653489 0.6116704 1.5069345" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -1965,7 +1965,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.1023873 -0.4180822 -0.9026206 0.9281499 0.2862708 -0.2378801 0.3578474 -0.8621231 0.3587325 0.1873666 0.6983235 1.4672089" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.1023873 -0.4180822 -0.9026206 0.9281499 0.2862708 -0.2378801 0.3578474 -0.8621231 0.3587325 0.1873666 0.6983237 1.4672090" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2067,7 +2067,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0656088 -0.4626088 -0.8841316 0.9937954 -0.1100428 -0.0161683 -0.0898128 -0.8797066 0.4669581 0.1996420 0.6531383 1.4435714" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0656088 -0.4626088 -0.8841316 0.9937954 -0.1100428 -0.0161683 -0.0898128 -0.8797066 0.4669581 0.1996421 0.6531384 1.4435714" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2169,7 +2169,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2373489 -0.1534441 -0.9592289 0.0973740 0.9862305 -0.1336694 -0.2218228 -0.0133082 0.8366759" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.9665319 -0.0616776 0.2490221 0.2373489 -0.1534441 -0.9592289 0.0973740 0.9862305 -0.1336694 -0.2218228 -0.0133083 0.8366759" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2220,7 +2220,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3615634 0.9298344 0.0684081 0.7452133 -0.2441212 -0.6205335 -0.5602937 0.2753409 -0.7811900 -0.2311346 -0.0315104 0.7648208" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3615634 0.9298344 0.0684081 0.7452133 -0.2441212 -0.6205335 -0.5602937 0.2753409 -0.7811900 -0.2311346 -0.0315104 0.7648209" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2271,7 +2271,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.7326652 -0.2684788 -0.6253964 -0.5956439 0.1916010 -0.7800621 -0.2399473 -0.0555735 0.7662210" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3292569 0.9440380 -0.0195383 0.7326652 -0.2684788 -0.6253964 -0.5956439 0.1916010 -0.7800621 -0.2399472 -0.0555734 0.7662212" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2322,7 +2322,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.5122607 -0.2425047 -0.8238812 -0.7815840 0.2659818 -0.5642518 -0.2625020 -0.0711384 0.8036732" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.5122607 -0.2425047 -0.8238812 -0.7815840 0.2659818 -0.5642518 -0.2625019 -0.0711384 0.8036732" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2373,7 +2373,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.6083978 -0.3508277 -0.7118790 -0.7275853 0.1116905 -0.6768638 -0.2653106 -0.0950621 0.8186633" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.6083978 -0.3508277 -0.7118790 -0.7275853 0.1116905 -0.6768638 -0.2653105 -0.0950620 0.8186634" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2475,7 +2475,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.1023873 -0.4180822 -0.9026206 0.0986766 0.8986452 -0.4274341 0.9898382 -0.1328314 -0.0507549 0.1570989 0.6889878 1.4749659" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.1023873 -0.4180822 -0.9026206 0.0986766 0.8986452 -0.4274341 0.9898382 -0.1328314 -0.0507549 0.1570989 0.6889879 1.4749659" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2526,7 +2526,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0260422 -0.4643564 -0.8852653 -0.5639869 0.7379948 -0.3705161 0.8253731 0.4896291 -0.2811100 0.1495006 0.6467174 1.4714146" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0260422 -0.4643564 -0.8852653 -0.5639869 0.7379948 -0.3705161 0.8253731 0.4896291 -0.2811100 0.1495006 0.6467175 1.4714146" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2628,7 +2628,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.1100348 -0.4672045 -0.8772753 0.2567038 0.8393306 -0.4791943 0.9602060 -0.2779281 0.0275776 0.1585392 0.6416523 1.4316828" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.1100348 -0.4672045 -0.8772753 0.2567038 0.8393306 -0.4791943 0.9602060 -0.2779281 0.0275776 0.1585393 0.6416522 1.4316828" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2793,7 +2793,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.7935058 -0.3318905 -0.5100955 -0.4935922 0.1392968 -0.8584654 -0.2455191 -0.0791781 0.7763593" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3559713 0.9329765 -0.0532857 0.7935058 -0.3318905 -0.5100955 -0.4935922 0.1392968 -0.8584654 -0.2455190 -0.0791781 0.7763594" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -2844,7 +2844,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.8471319 -0.3663475 -0.3849116 -0.4264922 -0.0366653 -0.9037473 -0.2508485 -0.1034015 0.8017413" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="0.3169729 0.9297552 -0.1873048 0.8471319 -0.3663475 -0.3849116 -0.4264922 -0.0366653 -0.9037473 -0.2508485 -0.1034015 0.8017412" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>
@ -3009,7 +3009,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="WorldTransform" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="Matrix3x4" field="m_data" value="-0.0656088 -0.4626088 -0.8841316 -0.8307251 0.5161862 -0.2084411 0.5528033 0.7207946 -0.4181670 0.1489982 0.6300828 1.4593928" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/> <Class name="Matrix3x4" field="m_data" value="-0.0656088 -0.4626088 -0.8841316 -0.8307251 0.5161862 -0.2084411 0.5528033 0.7207946 -0.4181670 0.1489982 0.6300829 1.4593928" type="{1906D8A5-7DEC-4DE3-A606-9E53BB3459E7}"/>
</Class> </Class>
</Class> </Class>
</Class> </Class>

@ -90,7 +90,7 @@ Node Path: RootNode.lodtest_lod1.lodtest_lod1_1
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 1283526254311745349 Positions: Count 192. Hash: 1283526254311745349
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 3728991722746136013 FaceList: Count 124. Hash: 8546457964849634958
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: lodtest_lod1_2 Node Name: lodtest_lod1_2
@ -107,7 +107,7 @@ Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 7921557352486854444 Positions: Count 192. Hash: 7921557352486854444
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 18311637590974204568 FaceList: Count 124. Hash: 7602933716150163115
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: transform Node Name: transform
@ -641,14 +641,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.TangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 11165448242141781141 Tangents: Count 192. Hash: 13347865366302598201
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.BitangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 7987814487334449536 Bitangents: Count 192. Hash: 11177881960262055002
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform
@ -705,14 +705,14 @@ Node Type: MeshVertexUVData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.TangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 7293001660047850407 Tangents: Count 192. Hash: 13256424469303674766
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.BitangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 2874689498270494796 Bitangents: Count 192. Hash: 12542581737782433115
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -424,7 +424,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="3728991722746136013" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="8546457964849634958" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -492,7 +492,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="18311637590974204568" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="7602933716150163115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1729,7 +1729,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11165448242141781141" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13347865366302598201" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1760,7 +1760,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7987814487334449536" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11177881960262055002" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1891,7 +1891,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7293001660047850407" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13256424469303674766" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1922,7 +1922,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="2874689498270494796" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="12542581737782433115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -15,7 +15,7 @@ Node Path: RootNode.Cone.Cone_1
Node Type: MeshData Node Type: MeshData
Positions: Count 128. Hash: 7714223793259938211 Positions: Count 128. Hash: 7714223793259938211
Normals: Count 128. Hash: 2352668179264002707 Normals: Count 128. Hash: 2352668179264002707
FaceList: Count 62. Hash: 14563017593520122982 FaceList: Count 62. Hash: 9996709738915796379
FaceMaterialIds: Count 62. Hash: 12234218120113875284 FaceMaterialIds: Count 62. Hash: 12234218120113875284
Node Name: Cone_2 Node Name: Cone_2
@ -32,7 +32,7 @@ Node Path: RootNode.Cone.Cone_1_optimized
Node Type: MeshData Node Type: MeshData
Positions: Count 128. Hash: 10174710861731544050 Positions: Count 128. Hash: 10174710861731544050
Normals: Count 128. Hash: 2352668179264002707 Normals: Count 128. Hash: 2352668179264002707
FaceList: Count 62. Hash: 11332459830831720586 FaceList: Count 62. Hash: 16809217014760075539
FaceMaterialIds: Count 62. Hash: 12234218120113875284 FaceMaterialIds: Count 62. Hash: 12234218120113875284
Node Name: Cube_phys_1 Node Name: Cube_phys_1
@ -100,14 +100,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cone.Cone_1.TangentSet_0 Node Path: RootNode.Cone.Cone_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 128. Hash: 14351734474754285313 Tangents: Count 128. Hash: 913385441694195840
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cone.Cone_1.BitangentSet_0 Node Path: RootNode.Cone.Cone_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 128. Hash: 15997251922861304891 Bitangents: Count 128. Hash: 16763868708150748964
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform
@ -164,14 +164,14 @@ Node Type: MeshVertexUVData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 128. Hash: 12937806066914201637 Tangents: Count 128. Hash: 11496565252852403390
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 128. Hash: 873786942732834087 Bitangents: Count 128. Hash: 6810649909977646014
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -55,7 +55,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="14563017593520122982" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="9996709738915796379" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -123,7 +123,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11332459830831720586" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="16809217014760075539" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -309,7 +309,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="14351734474754285313" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="913385441694195840" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -340,7 +340,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="15997251922861304891" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="16763868708150748964" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -471,7 +471,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="12937806066914201637" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11496565252852403390" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -502,7 +502,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="873786942732834087" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="6810649909977646014" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -40,7 +40,7 @@ Node Path: RootNode.Cone.Cone_1
Node Type: MeshData Node Type: MeshData
Positions: Count 128. Hash: 12506421592104186200 Positions: Count 128. Hash: 12506421592104186200
Normals: Count 128. Hash: 367461522682321485 Normals: Count 128. Hash: 367461522682321485
FaceList: Count 62. Hash: 13208951979626973193 FaceList: Count 62. Hash: 5910399941817424750
FaceMaterialIds: Count 62. Hash: 15454348664434923102 FaceMaterialIds: Count 62. Hash: 15454348664434923102
Node Name: Cone_2 Node Name: Cone_2
@ -57,7 +57,7 @@ Node Path: RootNode.Cone.Cone_1_optimized
Node Type: MeshData Node Type: MeshData
Positions: Count 128. Hash: 14946490408303214595 Positions: Count 128. Hash: 14946490408303214595
Normals: Count 128. Hash: 367461522682321485 Normals: Count 128. Hash: 367461522682321485
FaceList: Count 62. Hash: 11102693598481718079 FaceList: Count 62. Hash: 17210030509394354449
FaceMaterialIds: Count 62. Hash: 15454348664434923102 FaceMaterialIds: Count 62. Hash: 15454348664434923102
Node Name: transform Node Name: transform
@ -389,14 +389,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cone.Cone_1.TangentSet_0 Node Path: RootNode.Cone.Cone_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 128. Hash: 12695232913942738512 Tangents: Count 128. Hash: 11574815809363656385
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cone.Cone_1.BitangentSet_0 Node Path: RootNode.Cone.Cone_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 128. Hash: 9034210764777745751 Bitangents: Count 128. Hash: 1026129762512670051
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform
@ -483,14 +483,14 @@ Node Type: MeshVertexUVData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 128. Hash: 10740776669168782230 Tangents: Count 128. Hash: 5198081677141836233
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 128. Hash: 6990068477421150065 Bitangents: Count 128. Hash: 6948605204859680167
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -178,7 +178,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="13208951979626973193" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="5910399941817424750" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -246,7 +246,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11102693598481718079" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="17210030509394354449" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -957,7 +957,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="12695232913942738512" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11574815809363656385" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -988,7 +988,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="9034210764777745751" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="1026129762512670051" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1174,7 +1174,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="10740776669168782230" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="5198081677141836233" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -1205,7 +1205,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="6990068477421150065" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="6948605204859680167" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 1283526254311745349 Positions: Count 192. Hash: 1283526254311745349
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 3728991722746136013 FaceList: Count 124. Hash: 8546457964849634958
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: Cylinder_2 Node Name: Cylinder_2
@ -57,7 +57,7 @@ Node Path: RootNode.Cylinder.Cylinder_1_optimized
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 7921557352486854444 Positions: Count 192. Hash: 7921557352486854444
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 18311637590974204568 FaceList: Count 124. Hash: 7602933716150163115
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: transform Node Name: transform
@ -269,14 +269,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 11165448242141781141 Tangents: Count 192. Hash: 13347865366302598201
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 7987814487334449536 Bitangents: Count 192. Hash: 11177881960262055002
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform
@ -333,14 +333,14 @@ Node Type: MeshVertexUVData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 7293001660047850407 Tangents: Count 192. Hash: 13256424469303674766
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 2874689498270494796 Bitangents: Count 192. Hash: 12542581737782433115
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -178,7 +178,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="3728991722746136013" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="8546457964849634958" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -246,7 +246,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="18311637590974204568" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="7602933716150163115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -737,7 +737,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11165448242141781141" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13347865366302598201" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -768,7 +768,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7987814487334449536" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11177881960262055002" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -899,7 +899,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7293001660047850407" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13256424469303674766" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -930,7 +930,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="2874689498270494796" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="12542581737782433115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 1283526254311745349 Positions: Count 192. Hash: 1283526254311745349
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 3728991722746136013 FaceList: Count 124. Hash: 8546457964849634958
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: Cylinder_2 Node Name: Cylinder_2
@ -57,7 +57,7 @@ Node Path: RootNode.Cylinder.Cylinder_1_optimized
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 7921557352486854444 Positions: Count 192. Hash: 7921557352486854444
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 18311637590974204568 FaceList: Count 124. Hash: 7602933716150163115
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: transform Node Name: transform
@ -269,14 +269,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 11165448242141781141 Tangents: Count 192. Hash: 13347865366302598201
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 7987814487334449536 Bitangents: Count 192. Hash: 11177881960262055002
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform
@ -333,14 +333,14 @@ Node Type: MeshVertexUVData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 7293001660047850407 Tangents: Count 192. Hash: 13256424469303674766
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 2874689498270494796 Bitangents: Count 192. Hash: 12542581737782433115
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -178,7 +178,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="3728991722746136013" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="8546457964849634958" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -246,7 +246,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="18311637590974204568" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="7602933716150163115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -737,7 +737,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11165448242141781141" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13347865366302598201" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -768,7 +768,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7987814487334449536" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11177881960262055002" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -899,7 +899,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7293001660047850407" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13256424469303674766" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -930,7 +930,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="2874689498270494796" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="12542581737782433115" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1
Node Type: MeshData Node Type: MeshData
Positions: Count 192. Hash: 1283526254311745349 Positions: Count 192. Hash: 1283526254311745349
Normals: Count 192. Hash: 1873340970602844856 Normals: Count 192. Hash: 1873340970602844856
FaceList: Count 124. Hash: 3728991722746136013 FaceList: Count 124. Hash: 8546457964849634958
FaceMaterialIds: Count 124. Hash: 2372486708814455910 FaceMaterialIds: Count 124. Hash: 2372486708814455910
Node Name: Cylinder_2 Node Name: Cylinder_2
@ -261,14 +261,14 @@ Node Type: MaterialData
Node Name: TangentSet_0 Node Name: TangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0
Node Type: MeshVertexTangentData Node Type: MeshVertexTangentData
Tangents: Count 192. Hash: 11165448242141781141 Tangents: Count 192. Hash: 13347865366302598201
GenerationMethod: 1 GenerationMethod: 1
SetIndex: 0 SetIndex: 0
Node Name: BitangentSet_0 Node Name: BitangentSet_0
Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0
Node Type: MeshVertexBitangentData Node Type: MeshVertexBitangentData
Bitangents: Count 192. Hash: 7987814487334449536 Bitangents: Count 192. Hash: 11177881960262055002
GenerationMethod: 1 GenerationMethod: 1
Node Name: transform Node Name: transform

@ -178,7 +178,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="FaceList - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="3728991722746136013" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="8546457964849634958" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -682,7 +682,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Tangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="11165448242141781141" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="13347865366302598201" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
@ -713,7 +713,7 @@
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">
<Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/> <Class name="AZStd::string" field="value1" value="Bitangents - Hash" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
<Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}"> <Class name="any" field="value2" type="{03924488-C7F4-4D6D-948B-ABC2D1AE2FD3}">
<Class name="AZ::u64" field="m_data" value="7987814487334449536" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/> <Class name="AZ::u64" field="m_data" value="11177881960262055002" type="{D6597933-47CD-4FC8-B911-63F3E2B0993A}"/>
</Class> </Class>
</Class> </Class>
<Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}"> <Class name="AZStd::pair" field="element" type="{48BF1FCF-92A6-52E1-A543-F0B96702B0E2}">

@ -78,7 +78,7 @@ class TestAutomationBase:
file_system.restore_backup(workspace.paths.editor_log(), workspace.paths.project_log()) file_system.restore_backup(workspace.paths.editor_log(), workspace.paths.project_log())
except FileNotFoundError as e: except FileNotFoundError as e:
self.logger.debug(f"File restoration failed, editor log could not be found.\nError: {e}") self.logger.debug(f"File restoration failed, editor log could not be found.\nError: {e}")
editor.kill() editor.stop()
request.addfinalizer(teardown) request.addfinalizer(teardown)
@ -113,7 +113,7 @@ class TestAutomationBase:
editor.wait(TestAutomationBase.MAX_TIMEOUT) editor.wait(TestAutomationBase.MAX_TIMEOUT)
except WaitTimeoutError: except WaitTimeoutError:
errors.append(TestRunError("TIMEOUT", f"Editor did not close after {TestAutomationBase.MAX_TIMEOUT} seconds, verify the test is ending and the application didn't freeze")) errors.append(TestRunError("TIMEOUT", f"Editor did not close after {TestAutomationBase.MAX_TIMEOUT} seconds, verify the test is ending and the application didn't freeze"))
editor.kill() editor.stop()
output = editor.get_output() output = editor.get_output()
self.logger.debug("Test output:\n" + output) self.logger.debug("Test output:\n" + output)

@ -568,22 +568,10 @@
"$type": "EditorScriptCanvasComponent", "$type": "EditorScriptCanvasComponent",
"Id": 14750978061505735417, "Id": 14750978061505735417,
"m_name": "GlobalGameData", "m_name": "GlobalGameData",
"m_assetHolder": {
"m_asset": {
"assetId": {
"guid": "{B16589A0-EA01-56BC-8141-91A3967FB95F}"
},
"assetHint": "levels/multiplayer/autocomponent_rpc/globalgamedata.scriptcanvas"
}
},
"runtimeDataIsValid": true, "runtimeDataIsValid": true,
"runtimeDataOverrides": { "sourceHandle": {
"source": { "id": "{B16589A0-EA01-56BC-8141-91A3967FB95F}",
"assetId": { "path": "levels/multiplayer/autocomponent_rpc/globalgamedata.scriptcanvas"
"guid": "{B16589A0-EA01-56BC-8141-91A3967FB95F}"
},
"assetHint": "levels/multiplayer/autocomponent_rpc/globalgamedata.scriptcanvas"
}
} }
}, },
"Component_[16436925042043744033]": { "Component_[16436925042043744033]": {
@ -636,6 +624,13 @@
"$type": "SelectionComponent", "$type": "SelectionComponent",
"Id": 12302672911455629152 "Id": 12302672911455629152
}, },
"Component_[12517591696100736853]": {
"$type": "GenericComponentWrapper",
"Id": 12517591696100736853,
"m_template": {
"$type": "AutomatedTesting::NetworkTestLevelEntityComponent"
}
},
"Component_[14169903623243423134]": { "Component_[14169903623243423134]": {
"$type": "EditorVisibilityComponent", "$type": "EditorVisibilityComponent",
"Id": 14169903623243423134 "Id": 14169903623243423134
@ -644,13 +639,6 @@
"$type": "EditorInspectorComponent", "$type": "EditorInspectorComponent",
"Id": 14607413934411389854 "Id": 14607413934411389854
}, },
"Component_[15396284312416541768]": {
"$type": "GenericComponentWrapper",
"Id": 15396284312416541768,
"m_template": {
"$type": "Multiplayer::LocalPredictionPlayerInputComponent"
}
},
"Component_[15494977028055234270]": { "Component_[15494977028055234270]": {
"$type": "EditorDisabledCompositionComponent", "$type": "EditorDisabledCompositionComponent",
"Id": 15494977028055234270 "Id": 15494977028055234270
@ -681,23 +669,17 @@
"Component_[7256163899440301540]": { "Component_[7256163899440301540]": {
"$type": "EditorScriptCanvasComponent", "$type": "EditorScriptCanvasComponent",
"Id": 7256163899440301540, "Id": 7256163899440301540,
"m_name": "AutoComponent_RPC_NetLevelEntity", "m_name": "AutoComponent_RPC_NetLevelEntity.scriptcanvas",
"m_assetHolder": {
"m_asset": {
"assetId": {
"guid": "{1D517006-AC01-5ECA-AE66-0E007871F0CD}"
},
"assetHint": "levels/multiplayer/autocomponent_rpc/autocomponent_rpc_netlevelentity.scriptcanvas"
}
},
"runtimeDataIsValid": true, "runtimeDataIsValid": true,
"runtimeDataOverrides": { "runtimeDataOverrides": {
"source": { "source": {
"assetId": { "id": "{1D517006-AC01-5ECA-AE66-0E007871F0CD}",
"guid": "{1D517006-AC01-5ECA-AE66-0E007871F0CD}" "path": "C:/prj/o3de/AutomatedTesting/Levels/Multiplayer/AutoComponent_RPC/AutoComponent_RPC_NetLevelEntity.scriptcanvas"
},
"assetHint": "levels/multiplayer/autocomponent_rpc/autocomponent_rpc_netlevelentity.scriptcanvas"
} }
},
"sourceHandle": {
"id": "{1D517006-AC01-5ECA-AE66-0E007871F0CD}",
"path": "levels/multiplayer/autocomponent_rpc/autocomponent_rpc_netlevelentity.scriptcanvas"
} }
}, },
"Component_[731336627222243355]": { "Component_[731336627222243355]": {
@ -730,13 +712,6 @@
"$type": "NetBindComponent" "$type": "NetBindComponent"
} }
}, },
"Component_[9816897251206708579]": {
"$type": "GenericComponentWrapper",
"Id": 9816897251206708579,
"m_template": {
"$type": "AutomatedTesting::NetworkTestPlayerComponent"
}
},
"Component_[9880860858035405475]": { "Component_[9880860858035405475]": {
"$type": "EditorOnlyEntityComponent", "$type": "EditorOnlyEntityComponent",
"Id": 9880860858035405475 "Id": 9880860858035405475

@ -91,22 +91,10 @@
"$type": "EditorScriptCanvasComponent", "$type": "EditorScriptCanvasComponent",
"Id": 10596595655489113153, "Id": 10596595655489113153,
"m_name": "AutoComponent_RPC", "m_name": "AutoComponent_RPC",
"m_assetHolder": {
"m_asset": {
"assetId": {
"guid": "{5ED120C4-07DC-56F1-80A7-37BFC98FD74E}"
},
"assetHint": "levels/multiplayer/autocomponent_rpc/autocomponent_rpc.scriptcanvas"
}
},
"runtimeDataIsValid": true, "runtimeDataIsValid": true,
"runtimeDataOverrides": { "sourceHandle": {
"source": { "id": "{5ED120C4-07DC-56F1-80A7-37BFC98FD74E}",
"assetId": { "path": "levels/multiplayer/autocomponent_rpc/autocomponent_rpc.scriptcanvas"
"guid": "{5ED120C4-07DC-56F1-80A7-37BFC98FD74E}"
},
"assetHint": "levels/multiplayer/autocomponent_rpc/autocomponent_rpc.scriptcanvas"
}
} }
}, },
"Component_[11440172471478606933]": { "Component_[11440172471478606933]": {
@ -184,6 +172,13 @@
"$type": "EditorEntityIconComponent", "$type": "EditorEntityIconComponent",
"Id": 9407892837096707905 "Id": 9407892837096707905
}, },
"Component_[9505416969829669337]": {
"$type": "EditorTagComponent",
"Id": 9505416969829669337,
"Tags": [
"Player"
]
},
"Component_[9878555871810913249]": { "Component_[9878555871810913249]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 9878555871810913249, "Id": 9878555871810913249,

@ -0,0 +1,581 @@
{
"ContainerEntity": {
"Id": "Entity_[1146574390643]",
"Name": "Level",
"Components": {
"Component_[10641544592923449938]": {
"$type": "EditorInspectorComponent",
"Id": 10641544592923449938
},
"Component_[12039882709170782873]": {
"$type": "EditorOnlyEntityComponent",
"Id": 12039882709170782873
},
"Component_[12265484671603697631]": {
"$type": "EditorPendingCompositionComponent",
"Id": 12265484671603697631
},
"Component_[14126657869720434043]": {
"$type": "EditorEntitySortComponent",
"Id": 14126657869720434043
},
"Component_[15230859088967841193]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 15230859088967841193,
"Parent Entity": ""
},
"Component_[16239496886950819870]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 16239496886950819870
},
"Component_[5688118765544765547]": {
"$type": "EditorEntityIconComponent",
"Id": 5688118765544765547
},
"Component_[6545738857812235305]": {
"$type": "SelectionComponent",
"Id": 6545738857812235305
},
"Component_[7247035804068349658]": {
"$type": "EditorPrefabComponent",
"Id": 7247035804068349658
},
"Component_[9307224322037797205]": {
"$type": "EditorLockComponent",
"Id": 9307224322037797205
},
"Component_[9562516168917670048]": {
"$type": "EditorVisibilityComponent",
"Id": 9562516168917670048
}
}
},
"Entities": {
"Entity_[1155164325235]": {
"Id": "Entity_[1155164325235]",
"Name": "Sun",
"Components": {
"Component_[10440557478882592717]": {
"$type": "SelectionComponent",
"Id": 10440557478882592717
},
"Component_[13620450453324765907]": {
"$type": "EditorLockComponent",
"Id": 13620450453324765907
},
"Component_[2134313378593666258]": {
"$type": "EditorInspectorComponent",
"Id": 2134313378593666258
},
"Component_[234010807770404186]": {
"$type": "EditorVisibilityComponent",
"Id": 234010807770404186
},
"Component_[2970359110423865725]": {
"$type": "EditorEntityIconComponent",
"Id": 2970359110423865725
},
"Component_[3722854130373041803]": {
"$type": "EditorOnlyEntityComponent",
"Id": 3722854130373041803
},
"Component_[5992533738676323195]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 5992533738676323195
},
"Component_[7378860763541895402]": {
"$type": "AZ::Render::EditorDirectionalLightComponent",
"Id": 7378860763541895402,
"Controller": {
"Configuration": {
"Intensity": 1.0,
"CameraEntityId": "",
"ShadowFilterMethod": 1
}
}
},
"Component_[7892834440890947578]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 7892834440890947578,
"Parent Entity": "Entity_[1176639161715]",
"Transform Data": {
"Translate": [
0.0,
0.0,
13.487043380737305
],
"Rotate": [
-76.13099670410156,
-0.847000002861023,
-15.8100004196167
]
}
},
"Component_[8599729549570828259]": {
"$type": "EditorEntitySortComponent",
"Id": 8599729549570828259
},
"Component_[952797371922080273]": {
"$type": "EditorPendingCompositionComponent",
"Id": 952797371922080273
}
}
},
"Entity_[1159459292531]": {
"Id": "Entity_[1159459292531]",
"Name": "Ground",
"Components": {
"Component_[11701138785793981042]": {
"$type": "SelectionComponent",
"Id": 11701138785793981042
},
"Component_[12260880513256986252]": {
"$type": "EditorEntityIconComponent",
"Id": 12260880513256986252
},
"Component_[13711420870643673468]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 13711420870643673468
},
"Component_[138002849734991713]": {
"$type": "EditorOnlyEntityComponent",
"Id": 138002849734991713
},
"Component_[16578565737331764849]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 16578565737331764849,
"Parent Entity": "Entity_[1176639161715]"
},
"Component_[16919232076966545697]": {
"$type": "EditorInspectorComponent",
"Id": 16919232076966545697
},
"Component_[5182430712893438093]": {
"$type": "EditorMaterialComponent",
"Id": 5182430712893438093
},
"Component_[5675108321710651991]": {
"$type": "AZ::Render::EditorMeshComponent",
"Id": 5675108321710651991,
"Controller": {
"Configuration": {
"ModelAsset": {
"assetId": {
"guid": "{0CD745C0-6AA8-569A-A68A-73A3270986C4}",
"subId": 277889906
},
"assetHint": "objects/groudplane/groundplane_512x512m.azmodel"
}
}
}
},
"Component_[5681893399601237518]": {
"$type": "EditorEntitySortComponent",
"Id": 5681893399601237518
},
"Component_[592692962543397545]": {
"$type": "EditorPendingCompositionComponent",
"Id": 592692962543397545
},
"Component_[7090012899106946164]": {
"$type": "EditorLockComponent",
"Id": 7090012899106946164
},
"Component_[9410832619875640998]": {
"$type": "EditorVisibilityComponent",
"Id": 9410832619875640998
}
}
},
"Entity_[1163754259827]": {
"Id": "Entity_[1163754259827]",
"Name": "Camera",
"Components": {
"Component_[11895140916889160460]": {
"$type": "EditorEntityIconComponent",
"Id": 11895140916889160460
},
"Component_[16880285896855930892]": {
"$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent",
"Id": 16880285896855930892,
"Controller": {
"Configuration": {
"Field of View": 55.0,
"EditorEntityId": 8929576024571800510
}
}
},
"Component_[17187464423780271193]": {
"$type": "EditorLockComponent",
"Id": 17187464423780271193
},
"Component_[17495696818315413311]": {
"$type": "EditorEntitySortComponent",
"Id": 17495696818315413311
},
"Component_[18086214374043522055]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 18086214374043522055,
"Parent Entity": "Entity_[1176639161715]",
"Transform Data": {
"Translate": [
-2.3000001907348633,
-3.9368600845336914,
1.0
],
"Rotate": [
-2.050307512283325,
1.9552897214889526,
-43.623355865478516
]
}
},
"Component_[18387556550380114975]": {
"$type": "SelectionComponent",
"Id": 18387556550380114975
},
"Component_[2654521436129313160]": {
"$type": "EditorVisibilityComponent",
"Id": 2654521436129313160
},
"Component_[5265045084611556958]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 5265045084611556958
},
"Component_[7169798125182238623]": {
"$type": "EditorPendingCompositionComponent",
"Id": 7169798125182238623
},
"Component_[7255796294953281766]": {
"$type": "GenericComponentWrapper",
"Id": 7255796294953281766,
"m_template": {
"$type": "FlyCameraInputComponent"
}
},
"Component_[8866210352157164042]": {
"$type": "EditorInspectorComponent",
"Id": 8866210352157164042
},
"Component_[9129253381063760879]": {
"$type": "EditorOnlyEntityComponent",
"Id": 9129253381063760879
}
}
},
"Entity_[1168049227123]": {
"Id": "Entity_[1168049227123]",
"Name": "Grid",
"Components": {
"Component_[11443347433215807130]": {
"$type": "EditorEntityIconComponent",
"Id": 11443347433215807130
},
"Component_[11779275529534764488]": {
"$type": "SelectionComponent",
"Id": 11779275529534764488
},
"Component_[14249419413039427459]": {
"$type": "EditorInspectorComponent",
"Id": 14249419413039427459
},
"Component_[15448581635946161318]": {
"$type": "AZ::Render::EditorGridComponent",
"Id": 15448581635946161318,
"Controller": {
"Configuration": {
"primarySpacing": 4.0,
"primaryColor": [
0.501960813999176,
0.501960813999176,
0.501960813999176
],
"secondarySpacing": 0.5,
"secondaryColor": [
0.250980406999588,
0.250980406999588,
0.250980406999588
]
}
}
},
"Component_[1843303322527297409]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 1843303322527297409
},
"Component_[380249072065273654]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 380249072065273654,
"Parent Entity": "Entity_[1176639161715]"
},
"Component_[7476660583684339787]": {
"$type": "EditorPendingCompositionComponent",
"Id": 7476660583684339787
},
"Component_[7557626501215118375]": {
"$type": "EditorEntitySortComponent",
"Id": 7557626501215118375
},
"Component_[7984048488947365511]": {
"$type": "EditorVisibilityComponent",
"Id": 7984048488947365511
},
"Component_[8118181039276487398]": {
"$type": "EditorOnlyEntityComponent",
"Id": 8118181039276487398
},
"Component_[9189909764215270515]": {
"$type": "EditorLockComponent",
"Id": 9189909764215270515
}
}
},
"Entity_[1172344194419]": {
"Id": "Entity_[1172344194419]",
"Name": "Shader Ball",
"Components": {
"Component_[10789351944715265527]": {
"$type": "EditorOnlyEntityComponent",
"Id": 10789351944715265527
},
"Component_[12037033284781049225]": {
"$type": "EditorEntitySortComponent",
"Id": 12037033284781049225
},
"Component_[13759153306105970079]": {
"$type": "EditorPendingCompositionComponent",
"Id": 13759153306105970079
},
"Component_[14135560884830586279]": {
"$type": "EditorInspectorComponent",
"Id": 14135560884830586279
},
"Component_[16247165675903986673]": {
"$type": "EditorVisibilityComponent",
"Id": 16247165675903986673
},
"Component_[18082433625958885247]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 18082433625958885247
},
"Component_[6472623349872972660]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 6472623349872972660,
"Parent Entity": "Entity_[1176639161715]",
"Transform Data": {
"Rotate": [
0.0,
0.10000000149011612,
180.0
]
}
},
"Component_[6495255223970673916]": {
"$type": "AZ::Render::EditorMeshComponent",
"Id": 6495255223970673916,
"Controller": {
"Configuration": {
"ModelAsset": {
"assetId": {
"guid": "{FD340C30-755C-5911-92A3-19A3F7A77931}",
"subId": 281415304
},
"assetHint": "objects/shaderball/shaderball_default_1m.azmodel"
}
}
}
},
"Component_[8056625192494070973]": {
"$type": "SelectionComponent",
"Id": 8056625192494070973
},
"Component_[8550141614185782969]": {
"$type": "EditorEntityIconComponent",
"Id": 8550141614185782969
},
"Component_[9439770997198325425]": {
"$type": "EditorLockComponent",
"Id": 9439770997198325425
}
}
},
"Entity_[1176639161715]": {
"Id": "Entity_[1176639161715]",
"Name": "Atom Default Environment",
"Components": {
"Component_[10757302973393310045]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 10757302973393310045,
"Parent Entity": "Entity_[1146574390643]"
},
"Component_[14505817420424255464]": {
"$type": "EditorInspectorComponent",
"Id": 14505817420424255464,
"ComponentOrderEntryArray": [
{
"ComponentId": 10757302973393310045
}
]
},
"Component_[14988041764659020032]": {
"$type": "EditorLockComponent",
"Id": 14988041764659020032
},
"Component_[15808690248755038124]": {
"$type": "SelectionComponent",
"Id": 15808690248755038124
},
"Component_[15900837685796817138]": {
"$type": "EditorVisibilityComponent",
"Id": 15900837685796817138
},
"Component_[3298767348226484884]": {
"$type": "EditorOnlyEntityComponent",
"Id": 3298767348226484884
},
"Component_[4076975109609220594]": {
"$type": "EditorPendingCompositionComponent",
"Id": 4076975109609220594
},
"Component_[5679760548946028854]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 5679760548946028854
},
"Component_[5855590796136709437]": {
"$type": "EditorEntitySortComponent",
"Id": 5855590796136709437,
"ChildEntityOrderEntryArray": [
{
"EntityId": "Entity_[1155164325235]"
},
{
"EntityId": "Entity_[1180934129011]",
"SortIndex": 1
},
{
"EntityId": "Entity_[1172344194419]",
"SortIndex": 2
},
{
"EntityId": "Entity_[1168049227123]",
"SortIndex": 3
},
{
"EntityId": "Entity_[1163754259827]",
"SortIndex": 4
},
{
"EntityId": "Entity_[1159459292531]",
"SortIndex": 5
}
]
},
"Component_[9277695270015777859]": {
"$type": "EditorEntityIconComponent",
"Id": 9277695270015777859
}
}
},
"Entity_[1180934129011]": {
"Id": "Entity_[1180934129011]",
"Name": "Global Sky",
"Components": {
"Component_[11231930600558681245]": {
"$type": "AZ::Render::EditorHDRiSkyboxComponent",
"Id": 11231930600558681245,
"Controller": {
"Configuration": {
"CubemapAsset": {
"assetId": {
"guid": "{215E47FD-D181-5832-B1AB-91673ABF6399}",
"subId": 1000
},
"assetHint": "lightingpresets/highcontrast/goegap_4k_skyboxcm.exr.streamingimage"
}
}
}
},
"Component_[11980494120202836095]": {
"$type": "SelectionComponent",
"Id": 11980494120202836095
},
"Component_[1428633914413949476]": {
"$type": "EditorLockComponent",
"Id": 1428633914413949476
},
"Component_[14936200426671614999]": {
"$type": "AZ::Render::EditorImageBasedLightComponent",
"Id": 14936200426671614999,
"Controller": {
"Configuration": {
"diffuseImageAsset": {
"assetId": {
"guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
"subId": 3000
},
"assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_ibldiffuse.exr.streamingimage"
},
"specularImageAsset": {
"assetId": {
"guid": "{3FD09945-D0F2-55C8-B9AF-B2FD421FE3BE}",
"subId": 2000
},
"assetHint": "lightingpresets/highcontrast/goegap_4k_iblglobalcm_iblspecular.exr.streamingimage"
}
}
}
},
"Component_[14994774102579326069]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 14994774102579326069
},
"Component_[15417479889044493340]": {
"$type": "EditorPendingCompositionComponent",
"Id": 15417479889044493340
},
"Component_[15826613364991382688]": {
"$type": "EditorEntitySortComponent",
"Id": 15826613364991382688
},
"Component_[1665003113283562343]": {
"$type": "EditorOnlyEntityComponent",
"Id": 1665003113283562343
},
"Component_[3704934735944502280]": {
"$type": "EditorEntityIconComponent",
"Id": 3704934735944502280
},
"Component_[5698542331457326479]": {
"$type": "EditorVisibilityComponent",
"Id": 5698542331457326479
},
"Component_[6644513399057217122]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 6644513399057217122,
"Parent Entity": "Entity_[1176639161715]"
},
"Component_[931091830724002070]": {
"$type": "EditorInspectorComponent",
"Id": 931091830724002070
}
}
}
},
"Instances": {
"Instance_[450137905015]": {
"Source": "Levels/Multiplayer/BasicConnectivity_Connects/Player.prefab",
"Patches": [
{
"op": "replace",
"path": "/ContainerEntity/Components/Component_[14438229160106431107]/Parent Entity",
"value": "../Entity_[1146574390643]"
},
{
"op": "replace",
"path": "/ContainerEntity/Components/Component_[14438229160106431107]/Transform Data/Translate/1",
"value": 10.0
}
]
}
}
}

@ -0,0 +1,118 @@
{
"ContainerEntity": {
"Id": "ContainerEntity",
"Name": "Player",
"Components": {
"Component_[10518577910351346732]": {
"$type": "EditorLockComponent",
"Id": 10518577910351346732
},
"Component_[10982887273490848966]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 10982887273490848966
},
"Component_[12400551793021799684]": {
"$type": "SelectionComponent",
"Id": 12400551793021799684
},
"Component_[1257365873906714292]": {
"$type": "EditorEntityIconComponent",
"Id": 1257365873906714292
},
"Component_[13311663931994949767]": {
"$type": "EditorOnlyEntityComponent",
"Id": 13311663931994949767
},
"Component_[14438229160106431107]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 14438229160106431107,
"Parent Entity": ""
},
"Component_[14636573223251575153]": {
"$type": "EditorVisibilityComponent",
"Id": 14636573223251575153
},
"Component_[18139850826775373128]": {
"$type": "EditorEntitySortComponent",
"Id": 18139850826775373128
},
"Component_[18149872971727933150]": {
"$type": "EditorInspectorComponent",
"Id": 18149872971727933150
},
"Component_[3361461948531668955]": {
"$type": "EditorPrefabComponent",
"Id": 3361461948531668955
},
"Component_[5198421115432838729]": {
"$type": "EditorPendingCompositionComponent",
"Id": 5198421115432838729
}
}
},
"Entities": {
"Entity_[458727839607]": {
"Id": "Entity_[458727839607]",
"Name": "Dummy",
"Components": {
"Component_[10453091667729858383]": {
"$type": "EditorLockComponent",
"Id": 10453091667729858383
},
"Component_[15287888392848689630]": {
"$type": "EditorEntityIconComponent",
"Id": 15287888392848689630
},
"Component_[15410933204460181490]": {
"$type": "EditorInspectorComponent",
"Id": 15410933204460181490,
"ComponentOrderEntryArray": [
{
"ComponentId": 868882495636022739
},
{
"ComponentId": 517239536919559179,
"SortIndex": 1
}
]
},
"Component_[17682830444684716936]": {
"$type": "EditorEntitySortComponent",
"Id": 17682830444684716936
},
"Component_[18433579260689698157]": {
"$type": "EditorPendingCompositionComponent",
"Id": 18433579260689698157
},
"Component_[2684999590909523769]": {
"$type": "SelectionComponent",
"Id": 2684999590909523769
},
"Component_[517239536919559179]": {
"$type": "GenericComponentWrapper",
"Id": 517239536919559179,
"m_template": {
"$type": "NetBindComponent"
}
},
"Component_[5980561685482761342]": {
"$type": "EditorDisabledCompositionComponent",
"Id": 5980561685482761342
},
"Component_[6553553408068929590]": {
"$type": "EditorVisibilityComponent",
"Id": 6553553408068929590
},
"Component_[8307469961954670365]": {
"$type": "EditorOnlyEntityComponent",
"Id": 8307469961954670365
},
"Component_[868882495636022739]": {
"$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent",
"Id": 868882495636022739,
"Parent Entity": "ContainerEntity"
}
}
}
}
}

@ -0,0 +1,12 @@
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0

@ -0,0 +1,36 @@
{
"materialType": "Materials/Types/StandardPBR.materialtype",
"materialTypeVersion": 4,
"properties": {
"baseColor": {
"textureMap": "Materials/decal/airship_symbol_decal.tif"
},
"general": {
"doubleSided": true
},
"metallic": {
"useTexture": false
},
"normal": {
"useTexture": false
},
"opacity": {
"alphaSource": "Split",
"factor": 0.6899999976158142,
"mode": "Cutout",
"textureMap": "Materials/decal/airship_symbol_decal.tif"
},
"roughness": {
"useTexture": false
},
"specularF0": {
"useTexture": false
},
"uv": {
"center": [
0.0,
1.0
]
}
}
}

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2252ba28e19432d99e58fa03b672f855e1f520805eda71764e076fe349e1915a
size 4205906

@ -588,7 +588,7 @@ QMenu* LevelEditorMenuHandler::CreateGameMenu()
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (!usePrefabSystemForLevels) if (!usePrefabSystemForLevels)
{ {
// Export to Engine // Export to Engine

@ -706,7 +706,7 @@ void CCryEditApp::OnFileSave()
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (!usePrefabSystemForLevels) if (!usePrefabSystemForLevels)
{ {
@ -2364,7 +2364,7 @@ void CCryEditApp::ExportLevel(bool bExportToGame, bool bExportTexture, bool bAut
{ {
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (usePrefabSystemForLevels) if (usePrefabSystemForLevels)
{ {
AZ_Assert(false, "Prefab system doesn't require level exports."); AZ_Assert(false, "Prefab system doesn't require level exports.");
@ -2405,7 +2405,7 @@ bool CCryEditApp::UserExportToGame(bool bNoMsgBox)
{ {
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (usePrefabSystemForLevels) if (usePrefabSystemForLevels)
{ {
AZ_Assert(false, "Export Level should no longer exist."); AZ_Assert(false, "Export Level should no longer exist.");
@ -2453,7 +2453,7 @@ void CCryEditApp::ExportToGame(bool bNoMsgBox)
{ {
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (usePrefabSystemForLevels) if (usePrefabSystemForLevels)
{ {
AZ_Assert(false, "Prefab system no longer exports levels."); AZ_Assert(false, "Prefab system no longer exports levels.");
@ -2961,7 +2961,7 @@ CCryEditApp::ECreateLevelResult CCryEditApp::CreateLevel(const QString& levelNam
{ {
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
// If we are creating a new level and we're in simulate mode, then switch it off before we do anything else // If we are creating a new level and we're in simulate mode, then switch it off before we do anything else
if (GetIEditor()->GetGameEngine() && GetIEditor()->GetGameEngine()->GetSimulationMode()) if (GetIEditor()->GetGameEngine() && GetIEditor()->GetGameEngine()->GetSimulationMode())
@ -3107,7 +3107,7 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled)
{ {
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (!usePrefabSystemForLevels) if (!usePrefabSystemForLevels)
{ {
QString str = QObject::tr("Level %1 has been changed. Save Level?").arg(GetIEditor()->GetGameEngine()->GetLevelName()); QString str = QObject::tr("Level %1 has been changed. Save Level?").arg(GetIEditor()->GetGameEngine()->GetLevelName());
@ -3321,7 +3321,7 @@ CCryEditDoc* CCryEditApp::OpenDocumentFile(const char* filename, bool addToMostR
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
// If we are loading and we're in simulate mode, then switch it off before we do anything else // If we are loading and we're in simulate mode, then switch it off before we do anything else
if (GetIEditor()->GetGameEngine() && GetIEditor()->GetGameEngine()->GetSimulationMode()) if (GetIEditor()->GetGameEngine() && GetIEditor()->GetGameEngine()->GetSimulationMode())

@ -371,7 +371,7 @@ void CCryEditDoc::Load(TDocMultiArchive& arrXmlAr, const QString& szFilename)
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (!usePrefabSystemForLevels) if (!usePrefabSystemForLevels)
{ {
@ -636,7 +636,7 @@ bool CCryEditDoc::SaveModified()
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (!usePrefabSystemForLevels) if (!usePrefabSystemForLevels)
{ {
QMessageBox saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); QMessageBox saveModifiedMessageBox(AzToolsFramework::GetActiveWindow());
@ -699,7 +699,7 @@ void CCryEditDoc::OnFileSaveAs()
CCryEditApp::instance()->AddToRecentFileList(levelFileDialog.GetFileName()); CCryEditApp::instance()->AddToRecentFileList(levelFileDialog.GetFileName());
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (usePrefabSystemForLevels) if (usePrefabSystemForLevels)
{ {
AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId =
@ -728,7 +728,7 @@ bool CCryEditDoc::BeforeOpenDocument(const QString& lpszPathName, TOpenDocContex
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (!usePrefabSystemForLevels) if (!usePrefabSystemForLevels)
{ {

@ -489,7 +489,7 @@ bool CGameEngine::LoadLevel(
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (!usePrefabSystemForLevels) if (!usePrefabSystemForLevels)
{ {

@ -100,7 +100,7 @@ bool CGameExporter::Export(unsigned int flags, [[maybe_unused]] EEndian eExportE
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (usePrefabSystemForLevels) if (usePrefabSystemForLevels)
{ {

@ -70,7 +70,7 @@ private:
{ {
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (usePrefabSystemForLevels) if (usePrefabSystemForLevels)
{ {
AZ_Assert(false, "Level.pak should no longer be used when prefabs are used for levels."); AZ_Assert(false, "Level.pak should no longer be used when prefabs are used for levels.");

@ -659,7 +659,7 @@ void MainWindow::InitActions()
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (!usePrefabSystemForLevels) if (!usePrefabSystemForLevels)
{ {
am->AddAction(ID_FILE_EXPORTTOGAMENOSURFACETEXTURE, tr("&Export to Engine")) am->AddAction(ID_FILE_EXPORTTOGAMENOSURFACETEXTURE, tr("&Export to Engine"))

@ -143,7 +143,8 @@ bool CImageUtil::LoadPGM(const QString& fileName, CImageEx& image)
fseek(file, 0, SEEK_SET); fseek(file, 0, SEEK_SET);
char* str = new char[fileSize]; char* str = new char[fileSize];
fread(str, fileSize, 1, file);
[[maybe_unused]] auto bytesRead = fread(str, fileSize, 1, file);
[[maybe_unused]] char* nextToken = nullptr; [[maybe_unused]] char* nextToken = nullptr;
token = azstrtok(str, 0, seps, &nextToken); token = azstrtok(str, 0, seps, &nextToken);

@ -136,7 +136,7 @@ namespace AZ::CommonOnDemandReflections
->template Constructor<typename ContainerType::value_type*>() ->template Constructor<typename ContainerType::value_type*>()
->Attribute(AZ::Script::Attributes::ConstructorOverride, &OnDemandLuaFunctions::ConstructStringView<ContainerType::value_type, ContainerType::traits_type>) ->Attribute(AZ::Script::Attributes::ConstructorOverride, &OnDemandLuaFunctions::ConstructStringView<ContainerType::value_type, ContainerType::traits_type>)
->Attribute(AZ::Script::Attributes::ReaderWriterOverride, ScriptContext::CustomReaderWriter(&OnDemandLuaFunctions::StringTypeToLua<ContainerType>, &OnDemandLuaFunctions::StringTypeFromLua<ContainerType>)) ->Attribute(AZ::Script::Attributes::ReaderWriterOverride, ScriptContext::CustomReaderWriter(&OnDemandLuaFunctions::StringTypeToLua<ContainerType>, &OnDemandLuaFunctions::StringTypeFromLua<ContainerType>))
->Method("ToString", [](const ContainerType& stringView) { return static_cast<AZStd::string>(stringView).c_str(); }, { { { "Reference", "String view object being converted to string" } } }) ->Method("ToString", [](const ContainerType& stringView) { return stringView.data(); }, { { { "Reference", "String view object being converted to string" } } })
->Attribute(AZ::Script::Attributes::ToolTip, "Converts string_view to string") ->Attribute(AZ::Script::Attributes::ToolTip, "Converts string_view to string")
->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::ToString) ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::ToString)
->template WrappingMember<const char*>(&ContainerType::data) ->template WrappingMember<const char*>(&ContainerType::data)

@ -69,9 +69,11 @@ namespace UnitTest
// Note that ConvertToAbsolutePath will perform a realpath on the result. The result of AZ::Utils::GetExecutableDirectory // Note that ConvertToAbsolutePath will perform a realpath on the result. The result of AZ::Utils::GetExecutableDirectory
// uses AZ::Android::AndroidEnv::Get()->GetAppPrivateStoragePath() which will retrieve the storage path, but that path could // uses AZ::Android::AndroidEnv::Get()->GetAppPrivateStoragePath() which will retrieve the storage path, but that path could
// be symlinked, so we need to perform a real path on it before comparison // be symlinked, so we need to perform a real path on it before comparison
char realExecutableDirectory[AZ::IO::MaxPathLength]; char* realExecutableDirectory = realpath(executableDirectory, nullptr);
ASSERT_TRUE(realpath(executableDirectory, realExecutableDirectory)); ASSERT_NE(realExecutableDirectory, nullptr);
EXPECT_STRCASEEQ(realExecutableDirectory, absolutePath->c_str()); EXPECT_STRCASEEQ(realExecutableDirectory, absolutePath->c_str());
free(realExecutableDirectory);
} }
} }

@ -447,13 +447,13 @@ namespace UnitTest
{ {
x -= 1; x -= 1;
}); });
/*
// a <-- Root a <-- Root
// / \ / \
// b c b c
// \ / \ /
// d d
*/
a.Precedes(b, c); a.Precedes(b, c);
d.Follows(b, c); d.Follows(b, c);
@ -522,20 +522,20 @@ namespace UnitTest
{ {
x -= 1; x -= 1;
}); });
/*
// NOTE: The ideal way to express this topology is without the wait on the subgraph NOTE: The ideal way to express this topology is without the wait on the subgraph
// at task g, but this is more an illustrative test. Better is to express the entire at task g, but this is more an illustrative test. Better is to express the entire
// graph in a single larger graph. graph in a single larger graph.
// a <-- Root a <-- Root
// / \ / \
// b c - f b c - f
// \ \ \ \ \ \
// \ e - g \ e - g
// \ / \ /
// \ / \ /
// \ / \ /
// d d
*/
a.Precedes(b); a.Precedes(b);
a.Precedes(c); a.Precedes(c);
b.Precedes(d); b.Precedes(d);
@ -593,17 +593,17 @@ namespace UnitTest
{ {
x += 0b1000; x += 0b1000;
}); });
/*
// a <-- Root a <-- Root
// / \ / \
// b c - f b c - f
// \ \ \ \ \ \
// \ e - g \ e - g
// \ / \ /
// \ / \ /
// \ / \ /
// d d
*/
a.Precedes(b, c); a.Precedes(b, c);
b.Precedes(d); b.Precedes(d);
c.Precedes(e, f); c.Precedes(e, f);

@ -112,6 +112,7 @@ namespace AzFramework
virtual void SetPrefabSystemEnabled([[maybe_unused]] bool enable) {} virtual void SetPrefabSystemEnabled([[maybe_unused]] bool enable) {}
/// Returns true if Prefab System is enabled for use with levels, false if legacy level system is enabled (level.pak) /// Returns true if Prefab System is enabled for use with levels, false if legacy level system is enabled (level.pak)
/// @deprecated Use 'IsPrefabSystemEnabled' instead
virtual bool IsPrefabSystemForLevelsEnabled() const { return false; } virtual bool IsPrefabSystemForLevelsEnabled() const { return false; }
/// Returns true if code should assert when the Legacy Slice System is used /// Returns true if code should assert when the Legacy Slice System is used

@ -765,6 +765,7 @@ namespace AzFramework
bool Application::IsPrefabSystemForLevelsEnabled() const bool Application::IsPrefabSystemForLevelsEnabled() const
{ {
AZ_Warning("Application", false, "'IsPrefabSystemForLevelsEnabled' is deprecated, please use 'IsPrefabSystemEnabled' instead.");
return IsPrefabSystemEnabled(); return IsPrefabSystemEnabled();
} }

@ -1208,7 +1208,7 @@ namespace AZ::IO
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (usePrefabSystemForLevels) if (usePrefabSystemForLevels)
{ {
@ -1274,7 +1274,7 @@ namespace AZ::IO
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
AZStd::unique_lock lock(m_csZips); AZStd::unique_lock lock(m_csZips);
for (auto it = m_arrZips.begin(); it != m_arrZips.end();) for (auto it = m_arrZips.begin(); it != m_arrZips.end();)

@ -383,7 +383,7 @@ namespace AZ::IO::ZipDir
if (!AZ::IO::FileIOBase::GetDirectInstance()->Write(m_fileHandle, ptr, sizeToWrite)) if (!AZ::IO::FileIOBase::GetDirectInstance()->Write(m_fileHandle, ptr, sizeToWrite))
{ {
char error[1024]; char error[1024];
azstrerror_s(error, AZ_ARRAY_SIZE(error), errno); [[maybe_unused]] auto azStrErrorResult = azstrerror_s(error, AZ_ARRAY_SIZE(error), errno);
AZ_Warning("Archive", false, "Cannot write to zip file!! error = (%d): %s", errno, error); AZ_Warning("Archive", false, "Cannot write to zip file!! error = (%d): %s", errno, error);
return ZD_ERROR_IO_FAILED; return ZD_ERROR_IO_FAILED;
} }
@ -531,7 +531,7 @@ namespace AZ::IO::ZipDir
if (!WriteCompressedData((uint8_t*)pUncompressed, nSegmentSize, encrypt)) if (!WriteCompressedData((uint8_t*)pUncompressed, nSegmentSize, encrypt))
{ {
char error[1024]; char error[1024];
azstrerror_s(error, AZ_ARRAY_SIZE(error), errno); [[maybe_unused]] auto azStrErrorResult = azstrerror_s(error, AZ_ARRAY_SIZE(error), errno);
AZ_Warning("Archive", false, "Cannot write to zip file!! error = (%d): %s", errno, error); AZ_Warning("Archive", false, "Cannot write to zip file!! error = (%d): %s", errno, error);
return ZD_ERROR_IO_FAILED; return ZD_ERROR_IO_FAILED;
} }

@ -29,6 +29,19 @@ namespace AzFramework::SurfaceData
{ {
} }
//! Equality comparison operator for SurfaceTagWeight.
bool operator==(const SurfaceTagWeight& rhs) const
{
return (m_surfaceType == rhs.m_surfaceType) && (m_weight == rhs.m_weight);
}
//! Inequality comparison operator for SurfaceTagWeight.
bool operator!=(const SurfaceTagWeight& rhs) const
{
return !(*this == rhs);
}
AZ::Crc32 m_surfaceType = AZ::Crc32(Constants::s_unassignedTagName); AZ::Crc32 m_surfaceType = AZ::Crc32(Constants::s_unassignedTagName);
float m_weight = 0.0f; //! A Value in the range [0.0f .. 1.0f] float m_weight = 0.0f; //! A Value in the range [0.0f .. 1.0f]

@ -165,10 +165,6 @@ set(FILES
Logging/MissingAssetLogger.cpp Logging/MissingAssetLogger.cpp
Logging/MissingAssetLogger.h Logging/MissingAssetLogger.h
Logging/MissingAssetNotificationBus.h Logging/MissingAssetNotificationBus.h
Matchmaking/IMatchmakingRequests.h
Matchmaking/MatchmakingRequests.cpp
Matchmaking/MatchmakingRequests.h
Matchmaking/MatchmakingNotifications.h
Scene/Scene.h Scene/Scene.h
Scene/Scene.inl Scene/Scene.inl
Scene/Scene.cpp Scene/Scene.cpp
@ -182,13 +178,6 @@ set(FILES
Script/ScriptDebugMsgReflection.h Script/ScriptDebugMsgReflection.h
Script/ScriptRemoteDebugging.cpp Script/ScriptRemoteDebugging.cpp
Script/ScriptRemoteDebugging.h Script/ScriptRemoteDebugging.h
Session/ISessionHandlingRequests.h
Session/ISessionRequests.h
Session/SessionRequests.cpp
Session/SessionRequests.h
Session/SessionConfig.cpp
Session/SessionConfig.h
Session/SessionNotifications.h
StreamingInstall/StreamingInstall.h StreamingInstall/StreamingInstall.h
StreamingInstall/StreamingInstall.cpp StreamingInstall/StreamingInstall.cpp
StreamingInstall/StreamingInstallRequests.h StreamingInstall/StreamingInstallRequests.h

@ -120,7 +120,7 @@ namespace AzFramework
int res = chdir(processLaunchInfo.m_workingDirectory.c_str()); int res = chdir(processLaunchInfo.m_workingDirectory.c_str());
if (res != 0) if (res != 0)
{ {
write(errorPipe[1], &errno, sizeof(int)); [[maybe_unused]] auto writeResult = write(errorPipe[1], &errno, sizeof(int));
// We *have* to _exit as we are the child process and simply // We *have* to _exit as we are the child process and simply
// returning at this point would mean we would start running // returning at this point would mean we would start running
// the code from our parent process and that will just wreck // the code from our parent process and that will just wreck
@ -132,15 +132,19 @@ namespace AzFramework
switch (processLaunchInfo.m_processPriority) switch (processLaunchInfo.m_processPriority)
{ {
case PROCESSPRIORITY_BELOWNORMAL: case PROCESSPRIORITY_BELOWNORMAL:
nice(1); {
[[maybe_unused]] auto niceResult = nice(1);
// also reduce disk impact: // also reduce disk impact:
// setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_UTILITY); // setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_UTILITY);
break; break;
}
case PROCESSPRIORITY_IDLE: case PROCESSPRIORITY_IDLE:
nice(20); {
[[maybe_unused]] auto niceResult = nice(20);
// also reduce disk impact: // also reduce disk impact:
// setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_THROTTLE); // setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_THROTTLE);
break; break;
}
} }
startupInfo.SetupHandlesForChildProcess(); startupInfo.SetupHandlesForChildProcess();
@ -153,7 +157,7 @@ namespace AzFramework
// to stop it from continuing to run as a clone of the parent. // to stop it from continuing to run as a clone of the parent.
// Communicate the error code back to the parent via a pipe for the // Communicate the error code back to the parent via a pipe for the
// parent to read. // parent to read.
write(errorPipe[1], &errval, sizeof(errval)); [[maybe_unused]] auto writeResult = write(errorPipe[1], &errval, sizeof(errval));
_exit(0); _exit(0);
} }
@ -317,7 +321,7 @@ namespace AzFramework
// Set up a pipe to communicate the error code from the subprocess's execvpe call // Set up a pipe to communicate the error code from the subprocess's execvpe call
AZStd::array<int, 2> childErrorPipeFds{}; AZStd::array<int, 2> childErrorPipeFds{};
pipe(childErrorPipeFds.data()); [[maybe_unused]] auto pipeResult = pipe(childErrorPipeFds.data());
// This configures the write end of the pipe to close on calls to `exec` // This configures the write end of the pipe to close on calls to `exec`
fcntl(childErrorPipeFds[1], F_SETFD, fcntl(childErrorPipeFds[1], F_GETFD) | FD_CLOEXEC); fcntl(childErrorPipeFds[1], F_SETFD, fcntl(childErrorPipeFds[1], F_GETFD) | FD_CLOEXEC);

@ -71,7 +71,7 @@ namespace AzNetworking
const char* GetNetworkErrorDesc(int32_t errorCode) const char* GetNetworkErrorDesc(int32_t errorCode)
{ {
static AZ_THREAD_LOCAL char buffer[1024]; static AZ_THREAD_LOCAL char buffer[1024];
strerror_r(errorCode, buffer, sizeof(buffer)); [[maybe_unused]] auto strErrorResult = strerror_r(errorCode, buffer, sizeof(buffer));
return buffer; return buffer;
} }
} }

@ -295,7 +295,7 @@ namespace AzToolsFramework
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList) for (const AzToolsFramework::AssetFileInfo& assetFileInfo : assetFileInfoList.m_fileInfoList)
{ {

@ -19,45 +19,69 @@
namespace AzToolsFramework namespace AzToolsFramework
{ {
namespace Prefab
{
//! A RootAliasPath can be used to store an alias path that starts from the Prefab EOS root instance.
//! The root instance itself is included in the path. These can be used as Instance handles across systems
//! that do not have visibility over InstanceOptionalReferences, or that need to store Instance handles
//! for longer than just the span of a function without the risk of them going out of scope.
using RootAliasPath = AliasPath;
}
class PrefabEditorEntityOwnershipInterface class PrefabEditorEntityOwnershipInterface
{ {
public: public:
AZ_RTTI(PrefabEditorEntityOwnershipInterface,"{38E764BA-A089-49F3-848F-46018822CE2E}"); AZ_RTTI(PrefabEditorEntityOwnershipInterface, "{38E764BA-A089-49F3-848F-46018822CE2E}");
//! Returns whether the system has a root instance assigned.
//! @return True if a root prefab is assigned, false otherwise.
virtual bool IsRootPrefabAssigned() const = 0;
//! Returns an optional reference to the root prefab instance.
virtual Prefab::InstanceOptionalReference GetRootPrefabInstance() = 0;
//! Returns the template id for the root prefab instance.
virtual Prefab::TemplateId GetRootPrefabTemplateId() = 0;
virtual void CreateNewLevelPrefab(AZStd::string_view filename, const AZStd::string& templateFilename) = 0;
//! Creates a prefab instance with the provided entities and nestedPrefabInstances. //! Creates a prefab instance with the provided entities and nestedPrefabInstances.
//! /param entities The entities to put under the new prefab. //! @param entities The entities to put under the new prefab.
//! /param nestedPrefabInstances The nested prefab instances to put under the new prefab. //! @param nestedPrefabInstances The nested prefab instances to put under the new prefab.
//! /param filePath The filepath corresponding to the prefab file to be created. //! @param filePath The filepath corresponding to the prefab file to be created.
//! /param instanceToParentUnder The instance the newly created prefab instance is parented under. //! @param instanceToParentUnder The instance the newly created prefab instance is parented under.
//! /return The optional reference to the prefab created. //! @return The optional reference to the prefab created.
virtual Prefab::InstanceOptionalReference CreatePrefab( virtual Prefab::InstanceOptionalReference CreatePrefab(
const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Prefab::Instance>>&& nestedPrefabInstances, const AZStd::vector<AZ::Entity*>& entities, AZStd::vector<AZStd::unique_ptr<Prefab::Instance>>&& nestedPrefabInstances,
AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder = AZStd::nullopt) = 0; AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder = AZStd::nullopt) = 0;
//! Instantiate the prefab file provided. //! Instantiate the prefab file provided.
//! /param filePath The filepath for the prefab file the instance should be created from. //! @param filePath The filepath for the prefab file the instance should be created from.
//! /param instanceToParentUnder The instance the newly instantiated prefab instance is parented under. //! @param instanceToParentUnder The instance the newly instantiated prefab instance is parented under.
//! /return The optional reference to the prefab instance. //! @return The optional reference to the prefab instance.
virtual Prefab::InstanceOptionalReference InstantiatePrefab( virtual Prefab::InstanceOptionalReference InstantiatePrefab(
AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder = AZStd::nullopt) = 0; AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder = AZStd::nullopt) = 0;
virtual Prefab::InstanceOptionalReference GetRootPrefabInstance() = 0; virtual void StartPlayInEditor() = 0;
virtual void StopPlayInEditor() = 0;
virtual Prefab::TemplateId GetRootPrefabTemplateId() = 0;
//! Get all Assets generated by Prefab processing when entering Play-In Editor mode (Ctrl+G) //! Get all Assets generated by Prefab processing when entering Play-In Editor mode (Ctrl+G)
//! /return The vector of Assets generated by Prefab processing //! @return The vector of Assets generated by Prefab processing
virtual const Prefab::PrefabConversionUtils::InMemorySpawnableAssetContainer::SpawnableAssets& GetPlayInEditorAssetData() const = 0; virtual const Prefab::PrefabConversionUtils::InMemorySpawnableAssetContainer::SpawnableAssets& GetPlayInEditorAssetData() const = 0;
virtual bool LoadFromStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) = 0; virtual bool LoadFromStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) = 0;
virtual bool SaveToStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) = 0; virtual bool SaveToStream(AZ::IO::GenericStream& stream, AZStd::string_view filename) = 0;
virtual void StartPlayInEditor() = 0;
virtual void StopPlayInEditor() = 0;
virtual void CreateNewLevelPrefab(AZStd::string_view filename, const AZStd::string& templateFilename) = 0; //! Returns the reference to the instance corresponding to the RootAliasPath provided.
//! @param rootAliasPath The RootAliasPath to be queried.
//! @return A reference to the instance if valid, AZStd::nullopt otherwise.
virtual Prefab::InstanceOptionalReference GetInstanceReferenceFromRootAliasPath(Prefab::RootAliasPath rootAliasPath) const = 0;
virtual bool IsRootPrefabAssigned() const = 0; //! Allows to iterate through all instances referenced in the path, from the root down.
//! @param rootAliasPath The RootAliasPath to iterate through. If invalid, callback will not be called.
//! @param callback The function to call on each instance. If it returns true, it prevents the rest of the path from being called.
//! @return True if the iteration was halted by a callback returning true, false otherwise. Also returns false if the path is invalid.
virtual bool GetInstancesInRootAliasPath(
Prefab::RootAliasPath rootAliasPath, const AZStd::function<bool(const Prefab::InstanceOptionalReference)>& callback) const = 0;
}; };
} }

@ -510,6 +510,70 @@ namespace AzToolsFramework
m_playInEditorData.m_isEnabled = false; m_playInEditorData.m_isEnabled = false;
} }
bool PrefabEditorEntityOwnershipService::IsValidRootAliasPath(Prefab::RootAliasPath rootAliasPath) const
{
return GetInstanceReferenceFromRootAliasPath(rootAliasPath) != AZStd::nullopt;
}
Prefab::InstanceOptionalReference PrefabEditorEntityOwnershipService::GetInstanceReferenceFromRootAliasPath(
Prefab::RootAliasPath rootAliasPath) const
{
Prefab::InstanceOptionalReference instance = *m_rootInstance;
for (const auto& pathElement : rootAliasPath)
{
if (pathElement.Native() == rootAliasPath.begin()->Native())
{
// If the root is not the root Instance, the rootAliasPath is invalid.
if (pathElement.Native() != instance->get().GetInstanceAlias())
{
return Prefab::InstanceOptionalReference();
}
}
else
{
// If the instance alias can't be found, the rootAliasPath is invalid.
instance = instance->get().FindNestedInstance(pathElement.Native());
if (!instance.has_value())
{
return Prefab::InstanceOptionalReference();
}
}
}
return instance;
}
bool PrefabEditorEntityOwnershipService::GetInstancesInRootAliasPath(
Prefab::RootAliasPath rootAliasPath, const AZStd::function<bool(const Prefab::InstanceOptionalReference)>& callback) const
{
if (!IsValidRootAliasPath(rootAliasPath))
{
return false;
}
Prefab::InstanceOptionalReference instance;
for (const auto& pathElement : rootAliasPath)
{
if (!instance.has_value())
{
instance = *m_rootInstance;
}
else
{
instance = instance->get().FindNestedInstance(pathElement.Native());
}
if(callback(instance))
{
return true;
}
}
return false;
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// Slice Buses implementation with Assert(false), this will exist only during Slice->Prefab // Slice Buses implementation with Assert(false), this will exist only during Slice->Prefab
// development to pinpoint and replace specific calls to Slice system // development to pinpoint and replace specific calls to Slice system

@ -169,11 +169,17 @@ namespace AzToolsFramework
void CreateNewLevelPrefab(AZStd::string_view filename, const AZStd::string& templateFilename) override; void CreateNewLevelPrefab(AZStd::string_view filename, const AZStd::string& templateFilename) override;
bool IsRootPrefabAssigned() const override; bool IsRootPrefabAssigned() const override;
Prefab::InstanceOptionalReference GetInstanceReferenceFromRootAliasPath(Prefab::RootAliasPath rootAliasPath) const override;
bool GetInstancesInRootAliasPath(
Prefab::RootAliasPath rootAliasPath, const AZStd::function<bool(const Prefab::InstanceOptionalReference)>& callback) const override;
protected: protected:
AZ::SliceComponent::SliceInstanceAddress GetOwningSlice() override; AZ::SliceComponent::SliceInstanceAddress GetOwningSlice() override;
private: private:
bool IsValidRootAliasPath(Prefab::RootAliasPath rootAliasPath) const;
struct PlayInEditorData struct PlayInEditorData
{ {
AzToolsFramework::Prefab::PrefabConversionUtils::InMemorySpawnableAssetContainer m_assetsCache; AzToolsFramework::Prefab::PrefabConversionUtils::InMemorySpawnableAssetContainer m_assetsCache;

@ -177,7 +177,6 @@ namespace AzToolsFramework
AZStd::pair<Instance*, AZ::EntityId> GetInstanceAndEntityIdFromAliasPath(AliasPathView relativeAliasPath); AZStd::pair<Instance*, AZ::EntityId> GetInstanceAndEntityIdFromAliasPath(AliasPathView relativeAliasPath);
AZStd::pair<const Instance*, AZ::EntityId> GetInstanceAndEntityIdFromAliasPath(AliasPathView relativeAliasPath) const; AZStd::pair<const Instance*, AZ::EntityId> GetInstanceAndEntityIdFromAliasPath(AliasPathView relativeAliasPath) const;
/** /**
* Gets the aliases of all the nested instances, which are sourced by the template with the given id. * Gets the aliases of all the nested instances, which are sourced by the template with the given id.
* *

@ -11,7 +11,6 @@
#include <AzToolsFramework/Commands/SelectionCommand.h> #include <AzToolsFramework/Commands/SelectionCommand.h>
#include <AzToolsFramework/ContainerEntity/ContainerEntityInterface.h> #include <AzToolsFramework/ContainerEntity/ContainerEntityInterface.h>
#include <AzToolsFramework/Entity/EditorEntityHelpers.h> #include <AzToolsFramework/Entity/EditorEntityHelpers.h>
#include <AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h>
#include <AzToolsFramework/Entity/ReadOnly/ReadOnlyEntityInterface.h> #include <AzToolsFramework/Entity/ReadOnly/ReadOnlyEntityInterface.h>
#include <AzToolsFramework/Prefab/Instance/Instance.h> #include <AzToolsFramework/Prefab/Instance/Instance.h>
#include <AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h> #include <AzToolsFramework/Prefab/Instance/InstanceEntityMapperInterface.h>
@ -97,9 +96,9 @@ namespace AzToolsFramework::Prefab
ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequestBus::Events::SetSelectedEntities, selectedEntities); ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequestBus::Events::SetSelectedEntities, selectedEntities);
} }
// Edit Prefab // Add undo element
{ {
auto editUndo = aznew PrefabFocusUndo("Edit Prefab"); auto editUndo = aznew PrefabFocusUndo("Focus Prefab");
editUndo->Capture(entityId); editUndo->Capture(entityId);
editUndo->SetParent(undoBatch.GetUndoBatch()); editUndo->SetParent(undoBatch.GetUndoBatch());
FocusOnPrefabInstanceOwningEntityId(entityId); FocusOnPrefabInstanceOwningEntityId(entityId);
@ -112,15 +111,24 @@ namespace AzToolsFramework::Prefab
[[maybe_unused]] AzFramework::EntityContextId entityContextId) [[maybe_unused]] AzFramework::EntityContextId entityContextId)
{ {
// If only one instance is in the hierarchy, this operation is invalid // If only one instance is in the hierarchy, this operation is invalid
size_t hierarchySize = m_instanceFocusHierarchy.size(); if (m_rootAliasFocusPathLength <= 1)
if (hierarchySize <= 1)
{ {
return AZ::Failure( return AZ::Failure(AZStd::string(
AZStd::string("Prefab Focus Handler: Could not complete FocusOnParentOfFocusedPrefab operation while focusing on the root.")); "Prefab Focus Handler: Could not complete FocusOnParentOfFocusedPrefab operation while focusing on the root."));
} }
RootAliasPath parentPath = m_rootAliasFocusPath;
parentPath.RemoveFilename();
// Retrieve parent of currently focused prefab. // Retrieve parent of currently focused prefab.
InstanceOptionalReference parentInstance = GetReferenceFromContainerEntityId(m_instanceFocusHierarchy[hierarchySize - 2]); InstanceOptionalReference parentInstance = GetInstanceReference(parentPath);
// If only one instance is in the hierarchy, this operation is invalid
if (!parentInstance.has_value())
{
return AZ::Failure(AZStd::string(
"Prefab Focus Handler: Could not retrieve parent of current focus in FocusOnParentOfFocusedPrefab."));
}
// Use container entity of parent Instance for focus operations. // Use container entity of parent Instance for focus operations.
AZ::EntityId entityId = parentInstance->get().GetContainerEntityId(); AZ::EntityId entityId = parentInstance->get().GetContainerEntityId();
@ -136,9 +144,9 @@ namespace AzToolsFramework::Prefab
ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequestBus::Events::SetSelectedEntities, selectedEntities); ToolsApplicationRequestBus::Broadcast(&ToolsApplicationRequestBus::Events::SetSelectedEntities, selectedEntities);
} }
// Edit Prefab // Add undo element
{ {
auto editUndo = aznew PrefabFocusUndo("Edit Prefab"); auto editUndo = aznew PrefabFocusUndo("Focus Prefab");
editUndo->Capture(entityId); editUndo->Capture(entityId);
editUndo->SetParent(undoBatch.GetUndoBatch()); editUndo->SetParent(undoBatch.GetUndoBatch());
FocusOnPrefabInstanceOwningEntityId(entityId); FocusOnPrefabInstanceOwningEntityId(entityId);
@ -149,12 +157,31 @@ namespace AzToolsFramework::Prefab
PrefabFocusOperationResult PrefabFocusHandler::FocusOnPathIndex([[maybe_unused]] AzFramework::EntityContextId entityContextId, int index) PrefabFocusOperationResult PrefabFocusHandler::FocusOnPathIndex([[maybe_unused]] AzFramework::EntityContextId entityContextId, int index)
{ {
if (index < 0 || index >= m_instanceFocusHierarchy.size()) if (index < 0 || index >= m_rootAliasFocusPathLength)
{ {
return AZ::Failure(AZStd::string("Prefab Focus Handler: Invalid index on FocusOnPathIndex.")); return AZ::Failure(AZStd::string("Prefab Focus Handler: Invalid index on FocusOnPathIndex."));
} }
InstanceOptionalReference focusedInstance = GetReferenceFromContainerEntityId(m_instanceFocusHierarchy[index]); int i = 0;
RootAliasPath indexedPath;
for (const auto& pathElement : m_rootAliasFocusPath)
{
indexedPath.Append(pathElement);
if (i == index)
{
break;
}
++i;
}
InstanceOptionalReference focusedInstance = GetInstanceReference(indexedPath);
if (!focusedInstance.has_value())
{
return AZ::Failure(AZStd::string::format("Prefab Focus Handler: Could not retrieve instance at index %i.", index));
}
return FocusOnOwningPrefab(focusedInstance->get().GetContainerEntityId()); return FocusOnOwningPrefab(focusedInstance->get().GetContainerEntityId());
} }
@ -192,13 +219,14 @@ namespace AzToolsFramework::Prefab
} }
// Close all container entities in the old path. // Close all container entities in the old path.
CloseInstanceContainers(m_instanceFocusHierarchy); SetInstanceContainersOpenState(m_rootAliasFocusPath, false);
AZ::EntityId previousContainerEntityId = m_focusedInstanceContainerEntityId; const RootAliasPath previousContainerRootAliasPath = m_rootAliasFocusPath;
const InstanceOptionalReference previousFocusedInstance = GetInstanceReference(previousContainerRootAliasPath);
// Do not store the container for the root instance, use an invalid EntityId instead. m_rootAliasFocusPath = focusedInstance->get().GetAbsoluteInstanceAliasPath();
m_focusedInstanceContainerEntityId = focusedInstance->get().GetParentInstance().has_value() ? focusedInstance->get().GetContainerEntityId() : AZ::EntityId();
m_focusedTemplateId = focusedInstance->get().GetTemplateId(); m_focusedTemplateId = focusedInstance->get().GetTemplateId();
m_rootAliasFocusPathLength = aznumeric_cast<int>(AZStd::distance(m_rootAliasFocusPath.begin(), m_rootAliasFocusPath.end()));
// Focus on the descendants of the container entity in the Editor, if the interface is initialized. // Focus on the descendants of the container entity in the Editor, if the interface is initialized.
if (m_focusModeInterface) if (m_focusModeInterface)
@ -214,15 +242,22 @@ namespace AzToolsFramework::Prefab
// Refresh the read-only cache, if the interface is initialized. // Refresh the read-only cache, if the interface is initialized.
if (m_readOnlyEntityQueryInterface) if (m_readOnlyEntityQueryInterface)
{ {
m_readOnlyEntityQueryInterface->RefreshReadOnlyState({ previousContainerEntityId, m_focusedInstanceContainerEntityId }); EntityIdList containerEntities;
if (previousFocusedInstance.has_value())
{
containerEntities.push_back(previousFocusedInstance->get().GetContainerEntityId());
}
containerEntities.push_back(focusedInstance->get().GetContainerEntityId());
m_readOnlyEntityQueryInterface->RefreshReadOnlyState(containerEntities);
} }
// Refresh path variables. // Refresh path variables.
RefreshInstanceFocusList();
RefreshInstanceFocusPath(); RefreshInstanceFocusPath();
// Open all container entities in the new path. // Open all container entities in the new path.
OpenInstanceContainers(m_instanceFocusHierarchy); SetInstanceContainersOpenState(m_rootAliasFocusPath, true);
PrefabFocusNotificationBus::Broadcast(&PrefabFocusNotifications::OnPrefabFocusChanged); PrefabFocusNotificationBus::Broadcast(&PrefabFocusNotifications::OnPrefabFocusChanged);
@ -237,17 +272,12 @@ namespace AzToolsFramework::Prefab
InstanceOptionalReference PrefabFocusHandler::GetFocusedPrefabInstance( InstanceOptionalReference PrefabFocusHandler::GetFocusedPrefabInstance(
[[maybe_unused]] AzFramework::EntityContextId entityContextId) const [[maybe_unused]] AzFramework::EntityContextId entityContextId) const
{ {
return GetReferenceFromContainerEntityId(m_focusedInstanceContainerEntityId); return GetInstanceReference(m_rootAliasFocusPath);
} }
AZ::EntityId PrefabFocusHandler::GetFocusedPrefabContainerEntityId([[maybe_unused]] AzFramework::EntityContextId entityContextId) const AZ::EntityId PrefabFocusHandler::GetFocusedPrefabContainerEntityId([[maybe_unused]] AzFramework::EntityContextId entityContextId) const
{ {
if (m_focusedInstanceContainerEntityId.IsValid()) if (const InstanceOptionalReference instance = GetInstanceReference(m_rootAliasFocusPath); instance.has_value())
{
return m_focusedInstanceContainerEntityId;
}
if (auto instance = GetReferenceFromContainerEntityId(m_focusedInstanceContainerEntityId); instance.has_value())
{ {
return instance->get().GetContainerEntityId(); return instance->get().GetContainerEntityId();
} }
@ -262,19 +292,13 @@ namespace AzToolsFramework::Prefab
return false; return false;
} }
InstanceOptionalReference instance = m_instanceEntityMapperInterface->FindOwningInstance(entityId); const InstanceOptionalConstReference instance = m_instanceEntityMapperInterface->FindOwningInstance(entityId);
if (!instance.has_value()) if (!instance.has_value())
{ {
return false; return false;
} }
// If this is owned by the root instance, that corresponds to an invalid m_focusedInstanceContainerEntityId. return (instance->get().GetAbsoluteInstanceAliasPath() == m_rootAliasFocusPath);
if (!instance->get().GetParentInstance().has_value())
{
return !m_focusedInstanceContainerEntityId.IsValid();
}
return (instance->get().GetContainerEntityId() == m_focusedInstanceContainerEntityId);
} }
bool PrefabFocusHandler::IsOwningPrefabInFocusHierarchy(AZ::EntityId entityId) const bool PrefabFocusHandler::IsOwningPrefabInFocusHierarchy(AZ::EntityId entityId) const
@ -284,18 +308,10 @@ namespace AzToolsFramework::Prefab
return false; return false;
} }
// If the focus is on the root, m_focusedInstanceContainerEntityId will be the invalid id. InstanceOptionalConstReference instance = m_instanceEntityMapperInterface->FindOwningInstance(entityId);
// In those case all entities are in the focus hierarchy and should return true.
if (!m_focusedInstanceContainerEntityId.IsValid())
{
return true;
}
InstanceOptionalReference instance = m_instanceEntityMapperInterface->FindOwningInstance(entityId);
while (instance.has_value()) while (instance.has_value())
{ {
if (instance->get().GetContainerEntityId() == m_focusedInstanceContainerEntityId) if (instance->get().GetAbsoluteInstanceAliasPath() == m_rootAliasFocusPath)
{ {
return true; return true;
} }
@ -308,40 +324,47 @@ namespace AzToolsFramework::Prefab
const AZ::IO::Path& PrefabFocusHandler::GetPrefabFocusPath([[maybe_unused]] AzFramework::EntityContextId entityContextId) const const AZ::IO::Path& PrefabFocusHandler::GetPrefabFocusPath([[maybe_unused]] AzFramework::EntityContextId entityContextId) const
{ {
return m_instanceFocusPath; return m_filenameFocusPath;
} }
const int PrefabFocusHandler::GetPrefabFocusPathLength([[maybe_unused]] AzFramework::EntityContextId entityContextId) const const int PrefabFocusHandler::GetPrefabFocusPathLength([[maybe_unused]] AzFramework::EntityContextId entityContextId) const
{ {
return aznumeric_cast<int>(m_instanceFocusHierarchy.size()); return m_rootAliasFocusPathLength;
} }
void PrefabFocusHandler::OnContextReset() void PrefabFocusHandler::OnContextReset()
{ {
// Clear the old focus vector
m_instanceFocusHierarchy.clear();
// Focus on the root prefab (AZ::EntityId() will default to it) // Focus on the root prefab (AZ::EntityId() will default to it)
FocusOnPrefabInstanceOwningEntityId(AZ::EntityId()); FocusOnPrefabInstanceOwningEntityId(AZ::EntityId());
} }
void PrefabFocusHandler::OnEntityInfoUpdatedName(AZ::EntityId entityId, [[maybe_unused]]const AZStd::string& name) void PrefabFocusHandler::OnEntityInfoUpdatedName(AZ::EntityId entityId, [[maybe_unused]]const AZStd::string& name)
{ {
// Determine if the entityId is the container for any of the instances in the vector. PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipInterface =
auto result = AZStd::find_if( AZ::Interface<PrefabEditorEntityOwnershipInterface>::Get();
m_instanceFocusHierarchy.begin(), m_instanceFocusHierarchy.end(),
[&, entityId](const AZ::EntityId& containerEntityId)
{
InstanceOptionalReference instance = GetReferenceFromContainerEntityId(containerEntityId);
return (instance->get().GetContainerEntityId() == entityId);
}
);
if (result != m_instanceFocusHierarchy.end()) if (prefabEditorEntityOwnershipInterface)
{ {
// Refresh the path and notify changes. // Determine if the entityId is the container for any of the instances in the vector.
RefreshInstanceFocusPath(); bool match = prefabEditorEntityOwnershipInterface->GetInstancesInRootAliasPath(
PrefabFocusNotificationBus::Broadcast(&PrefabFocusNotifications::OnPrefabFocusChanged); m_rootAliasFocusPath,
[&](const Prefab::InstanceOptionalReference instance)
{
if (instance->get().GetContainerEntityId() == entityId)
{
return true;
}
return false;
}
);
if (match)
{
// Refresh the path and notify changes.
RefreshInstanceFocusPath();
PrefabFocusNotificationBus::Broadcast(&PrefabFocusNotifications::OnPrefabFocusChanged);
}
} }
} }
@ -354,142 +377,116 @@ namespace AzToolsFramework::Prefab
void PrefabFocusHandler::OnPrefabTemplateDirtyFlagUpdated(TemplateId templateId, [[maybe_unused]] bool status) void PrefabFocusHandler::OnPrefabTemplateDirtyFlagUpdated(TemplateId templateId, [[maybe_unused]] bool status)
{ {
// Determine if the templateId matches any of the instances in the vector. PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipInterface =
auto result = AZStd::find_if( AZ::Interface<PrefabEditorEntityOwnershipInterface>::Get();
m_instanceFocusHierarchy.begin(), m_instanceFocusHierarchy.end(),
[&, templateId](const AZ::EntityId& containerEntityId)
{
InstanceOptionalReference instance = GetReferenceFromContainerEntityId(containerEntityId);
return (instance->get().GetTemplateId() == templateId);
}
);
if (result != m_instanceFocusHierarchy.end()) if (prefabEditorEntityOwnershipInterface)
{ {
// Refresh the path and notify changes. // Determine if the templateId matches any of the instances in the vector.
RefreshInstanceFocusPath(); bool match = prefabEditorEntityOwnershipInterface->GetInstancesInRootAliasPath(
PrefabFocusNotificationBus::Broadcast(&PrefabFocusNotifications::OnPrefabFocusChanged); m_rootAliasFocusPath,
} [&](const Prefab::InstanceOptionalReference instance)
} {
if (instance->get().GetTemplateId() == templateId)
void PrefabFocusHandler::RefreshInstanceFocusList() {
{ return true;
m_instanceFocusHierarchy.clear(); }
AZStd::list<InstanceOptionalReference> instanceFocusList; return false;
}
);
InstanceOptionalReference currentInstance = GetReferenceFromContainerEntityId(m_focusedInstanceContainerEntityId); if (match)
while (currentInstance.has_value())
{
if (currentInstance->get().GetParentInstance().has_value())
{ {
m_instanceFocusHierarchy.emplace_back(currentInstance->get().GetContainerEntityId()); // Refresh the path and notify changes.
RefreshInstanceFocusPath();
PrefabFocusNotificationBus::Broadcast(&PrefabFocusNotifications::OnPrefabFocusChanged);
} }
else
{
m_instanceFocusHierarchy.emplace_back(AZ::EntityId());
}
currentInstance = currentInstance->get().GetParentInstance();
} }
// Invert the vector, since we need the top instance to be at index 0.
AZStd::reverse(m_instanceFocusHierarchy.begin(), m_instanceFocusHierarchy.end());
} }
void PrefabFocusHandler::RefreshInstanceFocusPath() void PrefabFocusHandler::RefreshInstanceFocusPath()
{ {
auto prefabSystemComponentInterface = AZ::Interface<PrefabSystemComponentInterface>::Get(); m_filenameFocusPath.clear();
m_instanceFocusPath.clear(); PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipInterface =
AZ::Interface<PrefabEditorEntityOwnershipInterface>::Get();
size_t index = 0; PrefabSystemComponentInterface* prefabSystemComponentInterface = AZ::Interface<PrefabSystemComponentInterface>::Get();
size_t maxIndex = m_instanceFocusHierarchy.size() - 1;
for (const AZ::EntityId& containerEntityId : m_instanceFocusHierarchy) if (prefabEditorEntityOwnershipInterface && prefabSystemComponentInterface)
{ {
InstanceOptionalReference instance = GetReferenceFromContainerEntityId(containerEntityId); int i = 0;
if (instance.has_value())
{
AZStd::string prefabName;
if (index < maxIndex) prefabEditorEntityOwnershipInterface->GetInstancesInRootAliasPath(
m_rootAliasFocusPath,
[&](const Prefab::InstanceOptionalReference instance)
{ {
// Get the filename without the extension (stem). if (instance.has_value())
prefabName = instance->get().GetTemplateSourcePath().Stem().Native(); {
AZStd::string prefabName;
if (i == m_rootAliasFocusPathLength - 1)
{
// Get the full filename.
prefabName = instance->get().GetTemplateSourcePath().Filename().Native();
}
else
{
// Get the filename without the extension (stem).
prefabName = instance->get().GetTemplateSourcePath().Stem().Native();
}
if (prefabSystemComponentInterface->IsTemplateDirty(instance->get().GetTemplateId()))
{
prefabName += "*";
}
m_filenameFocusPath.Append(prefabName);
}
++i;
return false;
} }
else );
{
// Get the full filename.
prefabName = instance->get().GetTemplateSourcePath().Filename().Native();
}
if (prefabSystemComponentInterface->IsTemplateDirty(instance->get().GetTemplateId()))
{
prefabName += "*";
}
m_instanceFocusPath.Append(prefabName);
}
++index;
} }
} }
void PrefabFocusHandler::OpenInstanceContainers(const AZStd::vector<AZ::EntityId>& instances) const void PrefabFocusHandler::SetInstanceContainersOpenState(const RootAliasPath& rootAliasPath, bool openState) const
{ {
// If this is called outside the Editor, this interface won't be initialized. // If this is called outside the Editor, this interface won't be initialized.
if (!m_containerEntityInterface) if (!m_containerEntityInterface)
{ {
return; return;
} }
for (const AZ::EntityId& containerEntityId : instances)
{
InstanceOptionalReference instance = GetReferenceFromContainerEntityId(containerEntityId);
if (instance.has_value())
{
m_containerEntityInterface->SetContainerOpen(instance->get().GetContainerEntityId(), true);
}
}
}
void PrefabFocusHandler::CloseInstanceContainers(const AZStd::vector<AZ::EntityId>& instances) const PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipInterface =
{ AZ::Interface<PrefabEditorEntityOwnershipInterface>::Get();
// If this is called outside the Editor, this interface won't be initialized.
if (!m_containerEntityInterface)
{
return;
}
for (const AZ::EntityId& containerEntityId : instances) if (prefabEditorEntityOwnershipInterface)
{ {
InstanceOptionalReference instance = GetReferenceFromContainerEntityId(containerEntityId); prefabEditorEntityOwnershipInterface->GetInstancesInRootAliasPath(
rootAliasPath,
[&](const Prefab::InstanceOptionalReference instance)
{
m_containerEntityInterface->SetContainerOpen(instance->get().GetContainerEntityId(), openState);
if (instance.has_value()) return false;
{ }
m_containerEntityInterface->SetContainerOpen(instance->get().GetContainerEntityId(), false); );
}
} }
} }
InstanceOptionalReference PrefabFocusHandler::GetReferenceFromContainerEntityId(AZ::EntityId containerEntityId) const InstanceOptionalReference PrefabFocusHandler::GetInstanceReference(RootAliasPath rootAliasPath) const
{ {
if (!containerEntityId.IsValid()) PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipInterface =
{ AZ::Interface<PrefabEditorEntityOwnershipInterface>::Get();
PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipInterface =
AZ::Interface<PrefabEditorEntityOwnershipInterface>::Get();
if (!prefabEditorEntityOwnershipInterface) if (prefabEditorEntityOwnershipInterface)
{ {
return AZStd::nullopt; return prefabEditorEntityOwnershipInterface->GetInstanceReferenceFromRootAliasPath(rootAliasPath);
}
return prefabEditorEntityOwnershipInterface->GetRootPrefabInstance();
} }
return m_instanceEntityMapperInterface->FindOwningInstance(containerEntityId); return AZStd::nullopt;
} }
} // namespace AzToolsFramework::Prefab } // namespace AzToolsFramework::Prefab

@ -12,6 +12,7 @@
#include <AzToolsFramework/Entity/EditorEntityContextBus.h> #include <AzToolsFramework/Entity/EditorEntityContextBus.h>
#include <AzToolsFramework/Entity/EditorEntityInfoBus.h> #include <AzToolsFramework/Entity/EditorEntityInfoBus.h>
#include <AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h>
#include <AzToolsFramework/FocusMode/FocusModeInterface.h> #include <AzToolsFramework/FocusMode/FocusModeInterface.h>
#include <AzToolsFramework/Prefab/PrefabFocusInterface.h> #include <AzToolsFramework/Prefab/PrefabFocusInterface.h>
#include <AzToolsFramework/Prefab/PrefabFocusPublicInterface.h> #include <AzToolsFramework/Prefab/PrefabFocusPublicInterface.h>
@ -28,6 +29,7 @@ namespace AzToolsFramework
namespace AzToolsFramework::Prefab namespace AzToolsFramework::Prefab
{ {
class InstanceEntityMapperInterface; class InstanceEntityMapperInterface;
class PrefabSystemComponentInterface;
//! Handles Prefab Focus mode, determining which prefab file entity changes will target. //! Handles Prefab Focus mode, determining which prefab file entity changes will target.
class PrefabFocusHandler final class PrefabFocusHandler final
@ -73,23 +75,20 @@ namespace AzToolsFramework::Prefab
private: private:
PrefabFocusOperationResult FocusOnPrefabInstance(InstanceOptionalReference focusedInstance); PrefabFocusOperationResult FocusOnPrefabInstance(InstanceOptionalReference focusedInstance);
void RefreshInstanceFocusList();
void RefreshInstanceFocusPath(); void RefreshInstanceFocusPath();
void OpenInstanceContainers(const AZStd::vector<AZ::EntityId>& instances) const; void SetInstanceContainersOpenState(const RootAliasPath& rootAliasPath, bool openState) const;
void CloseInstanceContainers(const AZStd::vector<AZ::EntityId>& instances) const;
InstanceOptionalReference GetReferenceFromContainerEntityId(AZ::EntityId containerEntityId) const; InstanceOptionalReference GetInstanceReference(RootAliasPath rootAliasPath) const;
//! The EntityId of the prefab container entity for the instance the editor is currently focusing on. //! The alias path for the instance the editor is currently focusing on, starting from the root instance.
AZ::EntityId m_focusedInstanceContainerEntityId = AZ::EntityId(); RootAliasPath m_rootAliasFocusPath = RootAliasPath();
//! The templateId of the focused instance. //! The templateId of the focused instance.
TemplateId m_focusedTemplateId; TemplateId m_focusedTemplateId;
//! The list of instances going from the root (index 0) to the focused instance,
//! referenced by their prefab container's EntityId.
AZStd::vector<AZ::EntityId> m_instanceFocusHierarchy;
//! A path containing the filenames of the instances in the focus hierarchy, separated with a /. //! A path containing the filenames of the instances in the focus hierarchy, separated with a /.
AZ::IO::Path m_instanceFocusPath; AZ::IO::Path m_filenameFocusPath;
//! The length of the current focus path. Stored to simplify internal checks.
int m_rootAliasFocusPathLength = 0;
ContainerEntityInterface* m_containerEntityInterface = nullptr; ContainerEntityInterface* m_containerEntityInterface = nullptr;
FocusModeInterface* m_focusModeInterface = nullptr; FocusModeInterface* m_focusModeInterface = nullptr;

@ -815,7 +815,8 @@ namespace AzToolsFramework
if (templateRef.has_value()) if (templateRef.has_value())
{ {
return templateRef->get().IsDirty(); return !templateRef->get().IsProcedural() && // all procedural prefabs are read-only
templateRef->get().IsDirty();
} }
return false; return false;

@ -349,7 +349,7 @@ namespace AzToolsFramework
return false; return false;
} }
StatementPrototype stmt("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=:1;"); StatementPrototype stmt("SELECT COUNT(*) FROM sqlite_schema WHERE type='table' AND name=:1;");
Statement* execute = stmt.Prepare(m_db); // execute now belongs to stmt and will die when stmt leaves scope. Statement* execute = stmt.Prepare(m_db); // execute now belongs to stmt and will die when stmt leaves scope.
if (!execute->Prepared()) if (!execute->Prepared())
{ {
@ -501,7 +501,7 @@ namespace AzToolsFramework
// https://www.sqlite.org/c3ref/prepare.html ^^^^^^^^^ // https://www.sqlite.org/c3ref/prepare.html ^^^^^^^^^
int res = sqlite3_prepare_v2(db, m_parentPrototype->GetSqlText().c_str(), (int)m_parentPrototype->GetSqlText().length() + 1, &m_statement, NULL); int res = sqlite3_prepare_v2(db, m_parentPrototype->GetSqlText().c_str(), (int)m_parentPrototype->GetSqlText().length() + 1, &m_statement, NULL);
AZ_Assert(res == SQLITE_OK, "Statement::PrepareFirstTime: failed! %s ( prototype is '%s'). Error code returned is %d.", sqlite3_errmsg(db), m_parentPrototype->GetSqlText().c_str(), res); AZ_Assert(res == SQLITE_OK, "Statement::PrepareFirstTime: failed! %s ( prototype is '%s'). Error code returned is %d.", sqlite3_errmsg(db), m_parentPrototype->GetSqlText().c_str(), res);
return ((res == SQLITE_OK)&&(m_statement)); return ((res == SQLITE_OK)&&(m_statement));
} }
@ -703,7 +703,7 @@ namespace AzToolsFramework
int res = sqlite3_clear_bindings(m_statement); int res = sqlite3_clear_bindings(m_statement);
AZ_Assert(res == SQLITE_OK, "Statement::sqlite3_clear_bindings: failed!"); AZ_Assert(res == SQLITE_OK, "Statement::sqlite3_clear_bindings: failed!");
return (res == SQLITE_OK); return (res == SQLITE_OK);
} }
int Statement::GetNamedParamIdx(const char* name) int Statement::GetNamedParamIdx(const char* name)

@ -783,6 +783,7 @@ namespace AzToolsFramework
} }
EBUS_EVENT(ToolsApplicationEvents::Bus, InvalidatePropertyDisplay, Refresh_EntireTree); EBUS_EVENT(ToolsApplicationEvents::Bus, InvalidatePropertyDisplay, Refresh_EntireTree);
ToolsApplicationRequests::Bus::Broadcast(&ToolsApplicationRequests::Bus::Events::AddDirtyEntity, GetEntityId());
} }
void ScriptEditorComponent::LoadProperties() void ScriptEditorComponent::LoadProperties()

@ -41,6 +41,11 @@ namespace UnitTest
&AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded, &AzToolsFramework::EditorEntityContextRequests::HandleEntitiesAdded,
AzToolsFramework::EntityList{ m_entityMap[Passenger1EntityName], m_entityMap[Passenger2EntityName], m_entityMap[CityEntityName] }); AzToolsFramework::EntityList{ m_entityMap[Passenger1EntityName], m_entityMap[Passenger2EntityName], m_entityMap[CityEntityName] });
// Initialize Prefab EOS Interface
AzToolsFramework::PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipInterface =
AZ::Interface<AzToolsFramework::PrefabEditorEntityOwnershipInterface>::Get();
ASSERT_TRUE(prefabEditorEntityOwnershipInterface);
// Create a car prefab from the passenger1 entity. The container entity will be created as part of the process. // Create a car prefab from the passenger1 entity. The container entity will be created as part of the process.
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> carInstance = AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> carInstance =
m_prefabSystemComponent->CreatePrefab({ m_entityMap[Passenger1EntityName] }, {}, "test/car"); m_prefabSystemComponent->CreatePrefab({ m_entityMap[Passenger1EntityName] }, {}, "test/car");
@ -59,11 +64,14 @@ namespace UnitTest
ASSERT_TRUE(streetInstance); ASSERT_TRUE(streetInstance);
m_instanceMap[StreetEntityName] = streetInstance.get(); m_instanceMap[StreetEntityName] = streetInstance.get();
// Create a city prefab that nests the street instances created above and the city entity. The container entity will be created as part of the process. // Use the Prefab EOS root instance as the City instance. This will ensure functions that go through the EOS work in these tests too.
m_rootInstance = m_rootInstance = prefabEditorEntityOwnershipInterface->GetRootPrefabInstance();
m_prefabSystemComponent->CreatePrefab({ m_entityMap[CityEntityName] }, MakeInstanceList(AZStd::move(streetInstance)), "test/city"); ASSERT_TRUE(m_rootInstance.has_value());
ASSERT_TRUE(m_rootInstance);
m_instanceMap[CityEntityName] = m_rootInstance.get(); m_rootInstance->get().AddEntity(*m_entityMap[CityEntityName]);
m_rootInstance->get().AddInstance(AZStd::move(streetInstance));
m_instanceMap[CityEntityName] = &m_rootInstance->get();
} }
void SetUpEditorFixtureImpl() override void SetUpEditorFixtureImpl() override
@ -84,7 +92,7 @@ namespace UnitTest
void TearDownEditorFixtureImpl() override void TearDownEditorFixtureImpl() override
{ {
m_rootInstance.release(); m_rootInstance->get().Reset();
PrefabTestFixture::TearDownEditorFixtureImpl(); PrefabTestFixture::TearDownEditorFixtureImpl();
} }
@ -92,7 +100,7 @@ namespace UnitTest
AZStd::unordered_map<AZStd::string, AZ::Entity*> m_entityMap; AZStd::unordered_map<AZStd::string, AZ::Entity*> m_entityMap;
AZStd::unordered_map<AZStd::string, Instance*> m_instanceMap; AZStd::unordered_map<AZStd::string, Instance*> m_instanceMap;
AZStd::unique_ptr<AzToolsFramework::Prefab::Instance> m_rootInstance; InstanceOptionalReference m_rootInstance;
PrefabFocusInterface* m_prefabFocusInterface = nullptr; PrefabFocusInterface* m_prefabFocusInterface = nullptr;
PrefabFocusPublicInterface* m_prefabFocusPublicInterface = nullptr; PrefabFocusPublicInterface* m_prefabFocusPublicInterface = nullptr;
@ -106,9 +114,7 @@ namespace UnitTest
inline static const char* Passenger2EntityName = "Passenger2"; inline static const char* Passenger2EntityName = "Passenger2";
}; };
// Test was disabled because the implementation of GetFocusedPrefabInstance now relies on the Prefab EOS, TEST_F(PrefabFocusTests, FocusOnOwningPrefabRootContainer)
// which is not used by our test environment. This can be restored once Instance handles are implemented.
TEST_F(PrefabFocusTests, DISABLED_PrefabFocus_FocusOnOwningPrefab_RootContainer)
{ {
// Verify FocusOnOwningPrefab works when passing the container entity of the root prefab. // Verify FocusOnOwningPrefab works when passing the container entity of the root prefab.
{ {
@ -123,9 +129,7 @@ namespace UnitTest
} }
} }
// Test was disabled because the implementation of GetFocusedPrefabInstance now relies on the Prefab EOS, TEST_F(PrefabFocusTests, FocusOnOwningPrefabRootEntity)
// which is not used by our test environment. This can be restored once Instance handles are implemented.
TEST_F(PrefabFocusTests, DISABLED_PrefabFocus_FocusOnOwningPrefab_RootEntity)
{ {
// Verify FocusOnOwningPrefab works when passing a nested entity of the root prefab. // Verify FocusOnOwningPrefab works when passing a nested entity of the root prefab.
{ {
@ -140,7 +144,7 @@ namespace UnitTest
} }
} }
TEST_F(PrefabFocusTests, PrefabFocus_FocusOnOwningPrefab_NestedContainer) TEST_F(PrefabFocusTests, FocusOnOwningPrefabNestedContainer)
{ {
// Verify FocusOnOwningPrefab works when passing the container entity of a nested prefab. // Verify FocusOnOwningPrefab works when passing the container entity of a nested prefab.
{ {
@ -154,7 +158,7 @@ namespace UnitTest
} }
} }
TEST_F(PrefabFocusTests, PrefabFocus_FocusOnOwningPrefab_NestedEntity) TEST_F(PrefabFocusTests, FocusOnOwningPrefabNestedEntity)
{ {
// Verify FocusOnOwningPrefab works when passing a nested entity of the a nested prefab. // Verify FocusOnOwningPrefab works when passing a nested entity of the a nested prefab.
{ {
@ -168,7 +172,7 @@ namespace UnitTest
} }
} }
TEST_F(PrefabFocusTests, PrefabFocus_FocusOnOwningPrefab_Clear) TEST_F(PrefabFocusTests, FocusOnOwningPrefabClear)
{ {
// Verify FocusOnOwningPrefab points to the root prefab when the focus is cleared. // Verify FocusOnOwningPrefab points to the root prefab when the focus is cleared.
{ {
@ -188,7 +192,32 @@ namespace UnitTest
} }
} }
TEST_F(PrefabFocusTests, PrefabFocus_IsOwningPrefabBeingFocused_Content) TEST_F(PrefabFocusTests, FocusOnParentOfFocusedPrefabLeaf)
{
// Call FocusOnParentOfFocusedPrefab on a leaf instance and verify the parent is focused correctly.
{
m_prefabFocusPublicInterface->FocusOnOwningPrefab(m_instanceMap[CarEntityName]->GetContainerEntityId());
m_prefabFocusPublicInterface->FocusOnParentOfFocusedPrefab(m_editorEntityContextId);
EXPECT_EQ(
&m_prefabFocusInterface->GetFocusedPrefabInstance(m_editorEntityContextId)->get(),
m_instanceMap[StreetEntityName]
);
}
}
TEST_F(PrefabFocusTests, FocusOnParentOfFocusedPrefabRoot)
{
// Call FocusOnParentOfFocusedPrefab on the root instance and verify the operation fails.
{
m_prefabFocusPublicInterface->FocusOnOwningPrefab(m_instanceMap[CityEntityName]->GetContainerEntityId());
auto outcome = m_prefabFocusPublicInterface->FocusOnParentOfFocusedPrefab(m_editorEntityContextId);
EXPECT_FALSE(outcome.IsSuccess());
}
}
TEST_F(PrefabFocusTests, IsOwningPrefabBeingFocusedContent)
{ {
// Verify IsOwningPrefabBeingFocused returns true for all entities in a focused prefab (container/nested) // Verify IsOwningPrefabBeingFocused returns true for all entities in a focused prefab (container/nested)
{ {
@ -199,7 +228,7 @@ namespace UnitTest
} }
} }
TEST_F(PrefabFocusTests, PrefabFocus_IsOwningPrefabBeingFocused_AncestorsDescendants) TEST_F(PrefabFocusTests, IsOwningPrefabBeingFocusedAncestorsDescendants)
{ {
// Verify IsOwningPrefabBeingFocused returns false for all entities not in a focused prefab (ancestors/descendants) // Verify IsOwningPrefabBeingFocused returns false for all entities not in a focused prefab (ancestors/descendants)
{ {
@ -213,7 +242,7 @@ namespace UnitTest
} }
} }
TEST_F(PrefabFocusTests, PrefabFocus_IsOwningPrefabBeingFocused_Siblings) TEST_F(PrefabFocusTests, IsOwningPrefabBeingFocusedSiblings)
{ {
// Verify IsOwningPrefabBeingFocused returns false for all entities not in a focused prefab (siblings) // Verify IsOwningPrefabBeingFocused returns false for all entities not in a focused prefab (siblings)
{ {

@ -19,13 +19,15 @@
#define AZ_DebugSecureSocket(...) #define AZ_DebugSecureSocket(...)
#define AZ_DebugSecureSocketConnection(window, fmt, ...) #define AZ_DebugSecureSocketConnection(window, fmt, ...)
//#define AZ_DebugUseSocketDebugLog /*
//#define AZ_DebugSecureSocket AZ_TracePrintf #define AZ_DebugUseSocketDebugLog
//#define AZ_DebugSecureSocketConnection(window, fmt, ...) \ #define AZ_DebugSecureSocket AZ_TracePrintf
//{\ #define AZ_DebugSecureSocketConnection(window, fmt, ...) \
// AZStd::string line = AZStd::string::format(fmt, __VA_ARGS__);\ {\
// this->m_dbgLog += line;\ AZStd::string line = AZStd::string::format(fmt, __VA_ARGS__);\
//} this->m_dbgLog += line;\
}
*/
#if AZ_TRAIT_GRIDMATE_SECURE_SOCKET_DRIVER_HOOK_ENABLED #if AZ_TRAIT_GRIDMATE_SECURE_SOCKET_DRIVER_HOOK_ENABLED
struct ssl_st; struct ssl_st;

@ -41,7 +41,7 @@ bool CLevelInfo::OpenLevelPak()
{ {
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
// The prefab system doesn't use level.pak // The prefab system doesn't use level.pak
if (usePrefabSystemForLevels) if (usePrefabSystemForLevels)
@ -62,7 +62,7 @@ void CLevelInfo::CloseLevelPak()
{ {
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
// The prefab system doesn't use level.pak // The prefab system doesn't use level.pak
if (usePrefabSystemForLevels) if (usePrefabSystemForLevels)
@ -82,7 +82,7 @@ bool CLevelInfo::ReadInfo()
{ {
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
// Set up a default game type for legacy code. // Set up a default game type for legacy code.
m_defaultGameTypeName = "mission0"; m_defaultGameTypeName = "mission0";

@ -1046,7 +1046,7 @@ AZ_POP_DISABLE_WARNING
// LEVEL SYSTEM // LEVEL SYSTEM
bool usePrefabSystemForLevels = false; bool usePrefabSystemForLevels = false;
AzFramework::ApplicationRequests::Bus::BroadcastResult( AzFramework::ApplicationRequests::Bus::BroadcastResult(
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
if (usePrefabSystemForLevels) if (usePrefabSystemForLevels)
{ {

@ -44,8 +44,6 @@ ly_add_target(
AZ::AssetBuilderSDK AZ::AssetBuilderSDK
AZ::AssetBuilder.Static AZ::AssetBuilder.Static
${additional_dependencies} ${additional_dependencies}
RUNTIME_DEPENDENCIES
AZ::AssetBuilder
) )
# Aggregates all combined AssetBuilders into a single LY_ASSET_BUILDERS #define # Aggregates all combined AssetBuilders into a single LY_ASSET_BUILDERS #define
@ -76,6 +74,8 @@ ly_add_target(
BUILD_DEPENDENCIES BUILD_DEPENDENCIES
PRIVATE PRIVATE
AZ::AssetProcessor.Static AZ::AssetProcessor.Static
RUNTIME_DEPENDENCIES
AZ::AssetBuilder
) )
# Adds the AssetProcessor target as a C preprocessor define so that it can be used as a Settings Registry # Adds the AssetProcessor target as a C preprocessor define so that it can be used as a Settings Registry
@ -122,6 +122,8 @@ ly_add_target(
BUILD_DEPENDENCIES BUILD_DEPENDENCIES
PRIVATE PRIVATE
AZ::AssetProcessorBatch.Static AZ::AssetProcessorBatch.Static
RUNTIME_DEPENDENCIES
AZ::AssetBuilder
) )
if(LY_DEFAULT_PROJECT_PATH) if(LY_DEFAULT_PROJECT_PATH)

@ -2942,11 +2942,20 @@ namespace AssetProcessor
// File is a source file that has been processed before // File is a source file that has been processed before
AZStd::string fingerprintFromDatabase = sourceFileItr->m_analysisFingerprint.toUtf8().data(); AZStd::string fingerprintFromDatabase = sourceFileItr->m_analysisFingerprint.toUtf8().data();
AZStd::string_view builderEntries(fingerprintFromDatabase.begin() + s_lengthOfUuid + 1, fingerprintFromDatabase.end()); AZStd::string_view builderEntries(fingerprintFromDatabase.begin() + s_lengthOfUuid + 1, fingerprintFromDatabase.end());
AZStd::string_view dependencyFingerprint(fingerprintFromDatabase.begin(), fingerprintFromDatabase.begin() + s_lengthOfUuid);
int numBuildersEmittingSourceDependencies = 0; int numBuildersEmittingSourceDependencies = 0;
if (!fingerprintFromDatabase.empty() && AreBuildersUnchanged(builderEntries, numBuildersEmittingSourceDependencies)) if (!fingerprintFromDatabase.empty() && AreBuildersUnchanged(builderEntries, numBuildersEmittingSourceDependencies))
{ {
// Builder(s) have not changed since last time // Builder(s) have not changed since last time
AZStd::string currentFingerprint = ComputeRecursiveDependenciesFingerprint(
fileInfo.m_filePath.toUtf8().constData(), sourceFileItr->m_sourceDatabaseName.toUtf8().constData());
if(dependencyFingerprint != currentFingerprint)
{
// Dependencies have changed
return false;
}
// Success - we can skip this file, nothing has changed! // Success - we can skip this file, nothing has changed!
// Remove it from the list of to-be-processed files, otherwise the AP will assume the file was deleted // Remove it from the list of to-be-processed files, otherwise the AP will assume the file was deleted
@ -4311,6 +4320,32 @@ namespace AssetProcessor
} }
} }
AZStd::string AssetProcessorManager::ComputeRecursiveDependenciesFingerprint(const AZStd::string& fileAbsolutePath, const AZStd::string& fileDatabaseName)
{
AZStd::string concatenatedFingerprints;
// QSet is not ordered.
SourceFilesForFingerprintingContainer knownDependenciesAbsolutePaths;
// this automatically adds the input file to the list:
QueryAbsolutePathDependenciesRecursive(QString::fromUtf8(fileDatabaseName.c_str()), knownDependenciesAbsolutePaths,
AzToolsFramework::AssetDatabase::SourceFileDependencyEntry::DEP_Any, false);
AddMetadataFilesForFingerprinting(QString::fromUtf8(fileAbsolutePath.c_str()), knownDependenciesAbsolutePaths);
// reserve 17 chars for each since its a 64 bit hex number, and then one more for the dash inbetween each.
constexpr int bytesPerFingerprint = (sizeof(AZ::u64) * 2) + 1; // 2 HEX characters per byte +1 for the `-` we will add between each fingerprint
concatenatedFingerprints.reserve((knownDependenciesAbsolutePaths.size() * bytesPerFingerprint));
for (const auto& element : knownDependenciesAbsolutePaths)
{
// if its a placeholder then don't bother hitting the disk to find it.
concatenatedFingerprints.append(AssetUtilities::GetFileFingerprint(element.first, element.second));
concatenatedFingerprints.append("-");
}
// to keep this from growing out of hand, we don't use the full string, we use a hash of it:
return AZ::Uuid::CreateName(concatenatedFingerprints.c_str()).ToString<AZStd::string>();
}
void AssetProcessorManager::FinishAnalysis(AZStd::string fileToCheck) void AssetProcessorManager::FinishAnalysis(AZStd::string fileToCheck)
{ {
using namespace AzToolsFramework::AssetDatabase; using namespace AzToolsFramework::AssetDatabase;
@ -4378,29 +4413,9 @@ namespace AssetProcessor
if (found) if (found)
{ {
// construct the analysis fingerprint // construct the analysis fingerprint
// the format for this data is "modtimefingerprint:builder0:builder1:builder2:...:buildern" // the format for this data is "hashfingerprint:builder0:builder1:builder2:...:buildern"
source.m_analysisFingerprint.clear(); source.m_analysisFingerprint = ComputeRecursiveDependenciesFingerprint(fileToCheck, analysisTracker->m_databaseSourceName);
// compute mod times:
// get the appropriate modtimes:
AZStd::string modTimeArray;
// QSet is not ordered.
SourceFilesForFingerprintingContainer knownDependenciesAbsolutePaths;
// this automatically adds the input file to the list:
QueryAbsolutePathDependenciesRecursive(QString::fromUtf8(analysisTracker->m_databaseSourceName.c_str()), knownDependenciesAbsolutePaths, SourceFileDependencyEntry::DEP_Any, false);
AddMetadataFilesForFingerprinting(QString::fromUtf8(fileToCheck.c_str()), knownDependenciesAbsolutePaths);
// reserve 17 chars for each since its a 64 bit hex number, and then one more for the dash inbetween each.
modTimeArray.reserve((knownDependenciesAbsolutePaths.size() * 17));
for (const auto& element : knownDependenciesAbsolutePaths)
{
// if its a placeholder then don't bother hitting the disk to find it.
modTimeArray.append(AssetUtilities::GetFileFingerprint(element.first, element.second));
modTimeArray.append("-");
}
// to keep this from growing out of hand, we don't use the full string, we use a hash of it:
source.m_analysisFingerprint = AZ::Uuid::CreateName(modTimeArray.c_str()).ToString<AZStd::string>();
for (const AZ::Uuid& builderID : analysisTracker->m_buildersInvolved) for (const AZ::Uuid& builderID : analysisTracker->m_buildersInvolved)
{ {
source.m_analysisFingerprint.append(":"); source.m_analysisFingerprint.append(":");
@ -4423,7 +4438,7 @@ namespace AssetProcessor
const ScanFolderInfo* scanFolder = m_platformConfig->GetScanFolderForFile(fileToCheck.c_str()); const ScanFolderInfo* scanFolder = m_platformConfig->GetScanFolderForFile(fileToCheck.c_str());
scanFolderPk = aznumeric_cast<int>(scanFolder->ScanFolderID()); scanFolderPk = aznumeric_cast<int>(scanFolder->ScanFolderID());
m_platformConfig->ConvertToRelativePath(fileToCheck.c_str(), scanFolder, databaseSourceName); PlatformConfiguration::ConvertToRelativePath(fileToCheck.c_str(), scanFolder, databaseSourceName);
} }
// Record the modtime for the file so we know we processed it // Record the modtime for the file so we know we processed it

@ -485,6 +485,7 @@ namespace AssetProcessor
}; };
void ComputeBuilderDirty(); void ComputeBuilderDirty();
AZStd::string ComputeRecursiveDependenciesFingerprint(const AZStd::string& fileAbsolutePath, const AZStd::string& fileDatabaseName);
AZStd::unordered_map<AZ::Uuid, BuilderData> m_builderDataCache; AZStd::unordered_map<AZ::Uuid, BuilderData> m_builderDataCache;
bool m_buildersAddedOrRemoved = true; //< true if any new builders exist. If this happens we actually need to re-analyze everything. bool m_buildersAddedOrRemoved = true; //< true if any new builders exist. If this happens we actually need to re-analyze everything.
bool m_anyBuilderChange = true; bool m_anyBuilderChange = true;

@ -516,6 +516,79 @@ namespace UnitTests
ASSERT_EQ(m_data->m_processResults.size(), 2); ASSERT_EQ(m_data->m_processResults.size(), 2);
} }
TEST_F(ModtimeScanningTest, AssetProcessorIsRestartedBeforeDependencyIsProcessed_DependencyIsProcessedOnStart)
{
using namespace AzToolsFramework::AssetSystem;
auto theFile = m_data->m_absolutePath[1].toUtf8();
const char* theFileString = theFile.constData();
SetFileContents(theFileString, "hello world");
// Enable the features we're testing
m_assetProcessorManager->SetEnableModtimeSkippingFeature(true);
AssetUtilities::SetUseFileHashOverride(true, true);
QSet<AssetFileInfo> filePaths = BuildFileSet();
SimulateAssetScanner(filePaths);
// Even though we're only updating one file, we're expecting 2 createJob calls because our test file is a dependency that triggers
// the other test file to process as well
ExpectWork(2, 2);
// Sort the results and process the first one, which should always be the modtimeTestDependency.txt file
// which is the same file we modified above. modtimeTestFile.txt depends on this file but we're not going to process it yet.
{
std::sort(
m_data->m_processResults.begin(), m_data->m_processResults.end(),
[](decltype(m_data->m_processResults[0])& left, decltype(left)& right)
{
return left.m_jobEntry.m_databaseSourceName < right.m_jobEntry.m_databaseSourceName;
});
const auto& processResult = m_data->m_processResults[0];
auto file =
QDir(processResult.m_destinationPath).absoluteFilePath(processResult.m_jobEntry.m_databaseSourceName.toLower() + ".arc1");
m_data->m_productPaths.emplace(
QDir(processResult.m_jobEntry.m_watchFolderPath)
.absoluteFilePath(processResult.m_jobEntry.m_databaseSourceName)
.toUtf8()
.constData(),
file);
// Create the file on disk
ASSERT_TRUE(UnitTestUtils::CreateDummyFile(file, "products."));
AssetBuilderSDK::ProcessJobResponse response;
response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success;
response.m_outputProducts.push_back(AssetBuilderSDK::JobProduct(file.toUtf8().constData(), AZ::Uuid::CreateNull(), 1));
using JobEntry = AssetProcessor::JobEntry;
QMetaObject::invokeMethod(
m_assetProcessorManager.get(), "AssetProcessed", Qt::QueuedConnection, Q_ARG(JobEntry, processResult.m_jobEntry),
Q_ARG(AssetBuilderSDK::ProcessJobResponse, response));
}
ASSERT_TRUE(BlockUntilIdle(5000));
// Shutdown and restart the APM
m_assetProcessorManager.reset();
m_assetProcessorManager = AZStd::make_unique<AssetProcessorManager_Test>(m_config.get());
SetUpAssetProcessorManager();
m_data->m_mockBuilderInfoHandler.m_createJobsCount = 0;
m_data->m_processResults.clear();
m_data->m_deletedSources.clear();
// Re-run the scanner on our files
filePaths = BuildFileSet();
SimulateAssetScanner(filePaths);
// Expect processing to resume on the job we didn't process before
ExpectWork(1, 1);
}
void DeleteTest::SetUp() void DeleteTest::SetUp()
{ {
AssetProcessorManagerTest::SetUp(); AssetProcessorManagerTest::SetUp();

@ -13,7 +13,7 @@ namespace AzTestRunner
{ {
void set_quiet_mode() void set_quiet_mode()
{ {
freopen("/dev/null", "a", stdout); [[maybe_unused]] auto freopenResult = freopen("/dev/null", "a", stdout);
} }
const char* get_current_working_directory() const char* get_current_working_directory()
@ -24,7 +24,7 @@ namespace AzTestRunner
void pause_on_completion() void pause_on_completion()
{ {
system("pause"); [[maybe_unused]] auto systemResult = system("pause");
} }
} }

@ -108,7 +108,7 @@ namespace LUAEditor
m_settingsDialog = aznew LUAEditorSettingsDialog(this); m_settingsDialog = aznew LUAEditorSettingsDialog(this);
actionTabForwards = new QAction(tr("Next Document Tab"), this); actionTabForwards = new QAction(tr("Next Document Tab"), this);
actionTabBackwards = new QAction(tr("Prev Document Tab"), this); actionTabBackwards = new QAction(tr("Previous Document Tab"), this);
actionTabForwards->setShortcut(QKeySequence("Ctrl+Tab")); actionTabForwards->setShortcut(QKeySequence("Ctrl+Tab"));
connect(actionTabForwards, SIGNAL(triggered(bool)), this, SLOT(OnTabForwards())); connect(actionTabForwards, SIGNAL(triggered(bool)), this, SLOT(OnTabForwards()));

@ -115,22 +115,22 @@ namespace AZ
const aiMesh* mesh = scene->mMeshes[currentNode->mMeshes[sdkMeshIndex]]; const aiMesh* mesh = scene->mMeshes[currentNode->mMeshes[sdkMeshIndex]];
if(mesh->mTextureCoords[texCoordIndex]) if(mesh->mTextureCoords[texCoordIndex])
{ {
if (mesh->mTextureCoordsNames[texCoordIndex].length > 0) if (mesh->HasTextureCoordsName(texCoordIndex))
{ {
if (!customNameFound) if (!customNameFound)
{ {
name = mesh->mTextureCoordsNames[texCoordIndex].C_Str(); name = mesh->GetTextureCoordsName(texCoordIndex)->C_Str();
customNameFound = true; customNameFound = true;
} }
else else
{ {
AZ_Warning(Utilities::WarningWindow, AZ_Warning(Utilities::WarningWindow,
strcmp(name.c_str(), mesh->mTextureCoordsNames[texCoordIndex].C_Str()) == 0, strcmp(name.c_str(), mesh->GetTextureCoordsName(texCoordIndex)->C_Str()) == 0,
"Node %s has conflicting mesh coordinate names at index %d, %s and %s. Using %s.", "Node %s has conflicting mesh coordinate names at index %d, %s and %s. Using %s.",
currentNode->mName.C_Str(), currentNode->mName.C_Str(),
texCoordIndex, texCoordIndex,
name.c_str(), name.c_str(),
mesh->mTextureCoordsNames[texCoordIndex].C_Str(), mesh->GetTextureCoordsName(texCoordIndex)->C_Str(),
name.c_str()); name.c_str());
} }
} }

@ -29,6 +29,7 @@ namespace AZ
if (behaviorContext) if (behaviorContext)
{ {
behaviorContext->Class<SceneAPI::DataTypes::IAnimationData>() behaviorContext->Class<SceneAPI::DataTypes::IAnimationData>()
->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::ListOnly)
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene") ->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("GetKeyFrameCount", &SceneAPI::DataTypes::IAnimationData::GetKeyFrameCount) ->Method("GetKeyFrameCount", &SceneAPI::DataTypes::IAnimationData::GetKeyFrameCount)
@ -97,6 +98,7 @@ namespace AZ
if (behaviorContext) if (behaviorContext)
{ {
behaviorContext->Class<SceneAPI::DataTypes::IBlendShapeAnimationData>() behaviorContext->Class<SceneAPI::DataTypes::IBlendShapeAnimationData>()
->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::ListOnly)
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene") ->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("GetBlendShapeName", &SceneAPI::DataTypes::IBlendShapeAnimationData::GetBlendShapeName) ->Method("GetBlendShapeName", &SceneAPI::DataTypes::IBlendShapeAnimationData::GetBlendShapeName)

@ -37,6 +37,7 @@ namespace AZ
if (behaviorContext) if (behaviorContext)
{ {
behaviorContext->Class<SceneAPI::DataTypes::IBlendShapeData>() behaviorContext->Class<SceneAPI::DataTypes::IBlendShapeData>()
->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::ListOnly)
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene") ->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("GetUsedControlPointCount", &SceneAPI::DataTypes::IBlendShapeData::GetUsedControlPointCount) ->Method("GetUsedControlPointCount", &SceneAPI::DataTypes::IBlendShapeData::GetUsedControlPointCount)

@ -47,6 +47,7 @@ namespace AZ
if (behaviorContext) if (behaviorContext)
{ {
behaviorContext->Class<SceneAPI::DataTypes::IBoneData>() behaviorContext->Class<SceneAPI::DataTypes::IBoneData>()
->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::ListOnly)
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene"); ->Attribute(AZ::Script::Attributes::Module, "scene");
behaviorContext->Class<AZ::SceneData::GraphData::BoneData>() behaviorContext->Class<AZ::SceneData::GraphData::BoneData>()

@ -304,6 +304,7 @@ namespace AZ
if (behaviorContext) if (behaviorContext)
{ {
behaviorContext->Class<SceneAPI::DataTypes::IMaterialData>() behaviorContext->Class<SceneAPI::DataTypes::IMaterialData>()
->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::ListOnly)
->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene"); ->Attribute(AZ::Script::Attributes::Module, "scene");

@ -33,6 +33,7 @@ namespace AZ
if (behaviorContext) if (behaviorContext)
{ {
behaviorContext->Class<SceneAPI::DataTypes::IMeshData>() behaviorContext->Class<SceneAPI::DataTypes::IMeshData>()
->Attribute(Script::Attributes::ExcludeFrom, Script::Attributes::ExcludeFlags::ListOnly)
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
->Attribute(AZ::Script::Attributes::Module, "scene") ->Attribute(AZ::Script::Attributes::Module, "scene")
->Method("GetUnitSizeInMeters", &MeshData::GetUnitSizeInMeters) ->Method("GetUnitSizeInMeters", &MeshData::GetUnitSizeInMeters)

@ -24,8 +24,8 @@ ly_add_target(
BUILD_DEPENDENCIES BUILD_DEPENDENCIES
PRIVATE PRIVATE
AZ::AzCore AZ::AzCore
AZ::AzFramework
Gem::AWSCore Gem::AWSCore
Gem::Multiplayer.Static
3rdParty::AWSNativeSDK::GameLiftClient 3rdParty::AWSNativeSDK::GameLiftClient
) )
@ -85,10 +85,10 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED)
BUILD_DEPENDENCIES BUILD_DEPENDENCIES
PRIVATE PRIVATE
AZ::AzCore AZ::AzCore
AZ::AzFramework
AZ::AzTest AZ::AzTest
Gem::AWSCore Gem::AWSCore
Gem::AWSGameLift.Client.Static Gem::AWSGameLift.Client.Static
Gem::Multiplayer.Static
3rdParty::AWSNativeSDK::GameLiftClient 3rdParty::AWSNativeSDK::GameLiftClient
AZ::AWSNativeSDKTestLibs AZ::AWSNativeSDKTestLibs
) )

@ -8,7 +8,7 @@
#pragma once #pragma once
#include <AzFramework/Matchmaking/MatchmakingRequests.h> #include <Multiplayer/Session/MatchmakingRequests.h>
namespace AWSGameLift namespace AWSGameLift
{ {
@ -17,10 +17,10 @@ namespace AWSGameLift
//! Registers a player's acceptance or rejection of a proposed FlexMatch match. //! Registers a player's acceptance or rejection of a proposed FlexMatch match.
//! AcceptMatchRequest //! AcceptMatchRequest
struct AWSGameLiftAcceptMatchRequest struct AWSGameLiftAcceptMatchRequest
: public AzFramework::AcceptMatchRequest : public Multiplayer::AcceptMatchRequest
{ {
public: public:
AZ_RTTI(AWSGameLiftAcceptMatchRequest, "{8372B297-88E8-4C13-B31D-BE87236CA416}", AzFramework::AcceptMatchRequest); AZ_RTTI(AWSGameLiftAcceptMatchRequest, "{8372B297-88E8-4C13-B31D-BE87236CA416}", Multiplayer::AcceptMatchRequest);
static void Reflect(AZ::ReflectContext* context); static void Reflect(AZ::ReflectContext* context);
AWSGameLiftAcceptMatchRequest() = default; AWSGameLiftAcceptMatchRequest() = default;

@ -8,7 +8,7 @@
#pragma once #pragma once
#include <AzFramework/Session/SessionRequests.h> #include <Multiplayer/Session/SessionRequests.h>
namespace AWSGameLift namespace AWSGameLift
{ {
@ -16,10 +16,10 @@ namespace AWSGameLift
//! GameLift create session on queue request which corresponds to Amazon GameLift //! GameLift create session on queue request which corresponds to Amazon GameLift
//! StartGameSessionPlacement //! StartGameSessionPlacement
struct AWSGameLiftCreateSessionOnQueueRequest struct AWSGameLiftCreateSessionOnQueueRequest
: public AzFramework::CreateSessionRequest : public Multiplayer::CreateSessionRequest
{ {
public: public:
AZ_RTTI(AWSGameLiftCreateSessionOnQueueRequest, "{2B99E594-CE81-4EB0-8888-74EF4242B59F}", AzFramework::CreateSessionRequest); AZ_RTTI(AWSGameLiftCreateSessionOnQueueRequest, "{2B99E594-CE81-4EB0-8888-74EF4242B59F}", Multiplayer::CreateSessionRequest);
static void Reflect(AZ::ReflectContext* context); static void Reflect(AZ::ReflectContext* context);
AWSGameLiftCreateSessionOnQueueRequest() = default; AWSGameLiftCreateSessionOnQueueRequest() = default;

@ -8,7 +8,7 @@
#pragma once #pragma once
#include <AzFramework/Session/SessionRequests.h> #include <Multiplayer/Session/SessionRequests.h>
namespace AWSGameLift namespace AWSGameLift
{ {
@ -16,10 +16,10 @@ namespace AWSGameLift
//! GameLift create session on fleet request which corresponds to Amazon GameLift //! GameLift create session on fleet request which corresponds to Amazon GameLift
//! CreateGameSessionRequest //! CreateGameSessionRequest
struct AWSGameLiftCreateSessionRequest struct AWSGameLiftCreateSessionRequest
: public AzFramework::CreateSessionRequest : public Multiplayer::CreateSessionRequest
{ {
public: public:
AZ_RTTI(AWSGameLiftCreateSessionRequest, "{69612D5D-F899-4DEB-AD63-4C497ABC5C0D}", AzFramework::CreateSessionRequest); AZ_RTTI(AWSGameLiftCreateSessionRequest, "{69612D5D-F899-4DEB-AD63-4C497ABC5C0D}", Multiplayer::CreateSessionRequest);
static void Reflect(AZ::ReflectContext* context); static void Reflect(AZ::ReflectContext* context);
AWSGameLiftCreateSessionRequest() = default; AWSGameLiftCreateSessionRequest() = default;

@ -8,7 +8,7 @@
#pragma once #pragma once
#include <AzFramework/Session/SessionRequests.h> #include <Multiplayer/Session/SessionRequests.h>
namespace AWSGameLift namespace AWSGameLift
{ {
@ -17,10 +17,10 @@ namespace AWSGameLift
//! Once player session has been created successfully in game session, gamelift client manager will //! Once player session has been created successfully in game session, gamelift client manager will
//! signal Multiplayer Gem to setup networking connection. //! signal Multiplayer Gem to setup networking connection.
struct AWSGameLiftJoinSessionRequest struct AWSGameLiftJoinSessionRequest
: public AzFramework::JoinSessionRequest : public Multiplayer::JoinSessionRequest
{ {
public: public:
AZ_RTTI(AWSGameLiftJoinSessionRequest, "{6EED6D15-531A-4956-90D0-2EDA31AC9CBA}", AzFramework::JoinSessionRequest); AZ_RTTI(AWSGameLiftJoinSessionRequest, "{6EED6D15-531A-4956-90D0-2EDA31AC9CBA}", Multiplayer::JoinSessionRequest);
static void Reflect(AZ::ReflectContext* context); static void Reflect(AZ::ReflectContext* context);
AWSGameLiftJoinSessionRequest() = default; AWSGameLiftJoinSessionRequest() = default;

@ -10,7 +10,7 @@
#include <AzCore/EBus/EBus.h> #include <AzCore/EBus/EBus.h>
#include <AzCore/std/string/string.h> #include <AzCore/std/string/string.h>
#include <AzFramework/Matchmaking/IMatchmakingRequests.h> #include <Multiplayer/Session/IMatchmakingRequests.h>
namespace AWSGameLift namespace AWSGameLift
{ {
@ -23,7 +23,7 @@ namespace AWSGameLift
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
}; };
using AWSGameLiftMatchmakingAsyncRequestBus = AZ::EBus<AzFramework::IMatchmakingAsyncRequests, AWSGameLiftMatchmakingAsyncRequests>; using AWSGameLiftMatchmakingAsyncRequestBus = AZ::EBus<Multiplayer::IMatchmakingAsyncRequests, AWSGameLiftMatchmakingAsyncRequests>;
// IMatchmakingRequests EBus wrapper // IMatchmakingRequests EBus wrapper
class AWSGameLiftMatchmakingRequests class AWSGameLiftMatchmakingRequests
@ -34,7 +34,7 @@ namespace AWSGameLift
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
}; };
using AWSGameLiftMatchmakingRequestBus = AZ::EBus<AzFramework::IMatchmakingRequests, AWSGameLiftMatchmakingRequests>; using AWSGameLiftMatchmakingRequestBus = AZ::EBus<Multiplayer::IMatchmakingRequests, AWSGameLiftMatchmakingRequests>;
//! IAWSGameLiftMatchmakingEventRequests //! IAWSGameLiftMatchmakingEventRequests
//! GameLift Gem matchmaking event interfaces which is used to track matchmaking ticket event //! GameLift Gem matchmaking event interfaces which is used to track matchmaking ticket event

@ -8,7 +8,7 @@
#pragma once #pragma once
#include <AzFramework/Session/SessionRequests.h> #include <Multiplayer/Session/SessionRequests.h>
namespace AWSGameLift namespace AWSGameLift
{ {
@ -16,10 +16,10 @@ namespace AWSGameLift
//! GameLift search sessions request which corresponds to Amazon GameLift //! GameLift search sessions request which corresponds to Amazon GameLift
//! SearchSessionsRequest //! SearchSessionsRequest
struct AWSGameLiftSearchSessionsRequest struct AWSGameLiftSearchSessionsRequest
: public AzFramework::SearchSessionsRequest : public Multiplayer::SearchSessionsRequest
{ {
public: public:
AZ_RTTI(AWSGameLiftSearchSessionsRequest, "{864C91C0-CA53-4585-BF07-066C0DF3E198}", AzFramework::SearchSessionsRequest); AZ_RTTI(AWSGameLiftSearchSessionsRequest, "{864C91C0-CA53-4585-BF07-066C0DF3E198}", Multiplayer::SearchSessionsRequest);
static void Reflect(AZ::ReflectContext* context); static void Reflect(AZ::ReflectContext* context);
AWSGameLiftSearchSessionsRequest() = default; AWSGameLiftSearchSessionsRequest() = default;

@ -10,7 +10,7 @@
#include <AzCore/EBus/EBus.h> #include <AzCore/EBus/EBus.h>
#include <AzCore/std/string/string.h> #include <AzCore/std/string/string.h>
#include <AzFramework/Session/ISessionRequests.h> #include <Multiplayer/Session/ISessionRequests.h>
namespace AWSGameLift namespace AWSGameLift
{ {
@ -23,7 +23,7 @@ namespace AWSGameLift
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
}; };
using AWSGameLiftSessionAsyncRequestBus = AZ::EBus<AzFramework::ISessionAsyncRequests, AWSGameLiftSessionAsyncRequests>; using AWSGameLiftSessionAsyncRequestBus = AZ::EBus<Multiplayer::ISessionAsyncRequests, AWSGameLiftSessionAsyncRequests>;
// ISessionRequests EBus wrapper // ISessionRequests EBus wrapper
class AWSGameLiftSessionRequests class AWSGameLiftSessionRequests
@ -34,5 +34,5 @@ namespace AWSGameLift
static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single;
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single;
}; };
using AWSGameLiftSessionRequestBus = AZ::EBus<AzFramework::ISessionRequests, AWSGameLiftSessionRequests>; using AWSGameLiftSessionRequestBus = AZ::EBus<Multiplayer::ISessionRequests, AWSGameLiftSessionRequests>;
} // namespace AWSGameLift } // namespace AWSGameLift

@ -10,7 +10,7 @@
#include <AzCore/std/containers/unordered_map.h> #include <AzCore/std/containers/unordered_map.h>
#include <AzCore/std/string/string.h> #include <AzCore/std/string/string.h>
#include <AzFramework/Matchmaking/MatchmakingRequests.h> #include <Multiplayer/Session/MatchmakingRequests.h>
#include <AWSGameLiftPlayer.h> #include <AWSGameLiftPlayer.h>
@ -21,10 +21,10 @@ namespace AWSGameLift
//! Uses FlexMatch to create a game match for a group of players based on custom matchmaking rules //! Uses FlexMatch to create a game match for a group of players based on custom matchmaking rules
//! StartMatchmakingRequest //! StartMatchmakingRequest
struct AWSGameLiftStartMatchmakingRequest struct AWSGameLiftStartMatchmakingRequest
: public AzFramework::StartMatchmakingRequest : public Multiplayer::StartMatchmakingRequest
{ {
public: public:
AZ_RTTI(AWSGameLiftStartMatchmakingRequest, "{D273DF71-9C55-48C1-95F9-8D7B66B9CF3E}", AzFramework::StartMatchmakingRequest); AZ_RTTI(AWSGameLiftStartMatchmakingRequest, "{D273DF71-9C55-48C1-95F9-8D7B66B9CF3E}", Multiplayer::StartMatchmakingRequest);
static void Reflect(AZ::ReflectContext* context); static void Reflect(AZ::ReflectContext* context);
AWSGameLiftStartMatchmakingRequest() = default; AWSGameLiftStartMatchmakingRequest() = default;

@ -8,7 +8,7 @@
#pragma once #pragma once
#include <AzFramework/Matchmaking/MatchmakingRequests.h> #include <Multiplayer/Session/MatchmakingRequests.h>
namespace AWSGameLift namespace AWSGameLift
{ {
@ -17,10 +17,10 @@ namespace AWSGameLift
//! Cancels a matchmaking ticket or match backfill ticket that is currently being processed. //! Cancels a matchmaking ticket or match backfill ticket that is currently being processed.
//! StopMatchmakingRequest //! StopMatchmakingRequest
struct AWSGameLiftStopMatchmakingRequest struct AWSGameLiftStopMatchmakingRequest
: public AzFramework::StopMatchmakingRequest : public Multiplayer::StopMatchmakingRequest
{ {
public: public:
AZ_RTTI(AWSGameLiftStopMatchmakingRequest, "{2766BC03-9F84-4346-A52B-49129BBAF38B}", AzFramework::StopMatchmakingRequest); AZ_RTTI(AWSGameLiftStopMatchmakingRequest, "{2766BC03-9F84-4346-A52B-49129BBAF38B}", Multiplayer::StopMatchmakingRequest);
static void Reflect(AZ::ReflectContext* context); static void Reflect(AZ::ReflectContext* context);
AWSGameLiftStopMatchmakingRequest() = default; AWSGameLiftStopMatchmakingRequest() = default;

@ -9,8 +9,8 @@
#include <AzCore/Interface/Interface.h> #include <AzCore/Interface/Interface.h>
#include <AzCore/std/bind/bind.h> #include <AzCore/std/bind/bind.h>
#include <AzCore/std/smart_ptr/shared_ptr.h> #include <AzCore/std/smart_ptr/shared_ptr.h>
#include <AzFramework/Session/ISessionHandlingRequests.h> #include <Multiplayer/Session/ISessionHandlingRequests.h>
#include <AzFramework/Matchmaking/MatchmakingNotifications.h> #include <Multiplayer/Session/MatchmakingNotifications.h>
#include <AWSGameLiftClientLocalTicketTracker.h> #include <AWSGameLiftClientLocalTicketTracker.h>
#include <AWSGameLiftSessionConstants.h> #include <AWSGameLiftSessionConstants.h>
@ -97,7 +97,7 @@ namespace AWSGameLift
AZ_TracePrintf(AWSGameLiftClientLocalTicketTrackerName, AZ_TracePrintf(AWSGameLiftClientLocalTicketTrackerName,
"Matchmaking ticket %s is complete.", ticket.GetTicketId().c_str()); "Matchmaking ticket %s is complete.", ticket.GetTicketId().c_str());
RequestPlayerJoinMatch(ticket, playerId); RequestPlayerJoinMatch(ticket, playerId);
AzFramework::MatchmakingNotificationBus::Broadcast(&AzFramework::MatchmakingNotifications::OnMatchComplete); Multiplayer::MatchmakingNotificationBus::Broadcast(&Multiplayer::MatchmakingNotifications::OnMatchComplete);
m_status = TicketTrackerStatus::Idle; m_status = TicketTrackerStatus::Idle;
return; return;
} }
@ -107,7 +107,7 @@ namespace AWSGameLift
{ {
AZ_Warning(AWSGameLiftClientLocalTicketTrackerName, false, "Matchmaking ticket %s is not complete, %s", AZ_Warning(AWSGameLiftClientLocalTicketTrackerName, false, "Matchmaking ticket %s is not complete, %s",
ticket.GetTicketId().c_str(), ticket.GetStatusMessage().c_str()); ticket.GetTicketId().c_str(), ticket.GetStatusMessage().c_str());
AzFramework::MatchmakingNotificationBus::Broadcast(&AzFramework::MatchmakingNotifications::OnMatchFailure); Multiplayer::MatchmakingNotificationBus::Broadcast(&Multiplayer::MatchmakingNotifications::OnMatchFailure);
m_status = TicketTrackerStatus::Idle; m_status = TicketTrackerStatus::Idle;
return; return;
} }
@ -115,7 +115,7 @@ namespace AWSGameLift
{ {
AZ_TracePrintf(AWSGameLiftClientLocalTicketTrackerName, "Matchmaking ticket %s is pending on acceptance, %s.", AZ_TracePrintf(AWSGameLiftClientLocalTicketTrackerName, "Matchmaking ticket %s is pending on acceptance, %s.",
ticket.GetTicketId().c_str(), ticket.GetStatusMessage().c_str()); ticket.GetTicketId().c_str(), ticket.GetStatusMessage().c_str());
AzFramework::MatchmakingNotificationBus::Broadcast(&AzFramework::MatchmakingNotifications::OnMatchAcceptance); Multiplayer::MatchmakingNotificationBus::Broadcast(&Multiplayer::MatchmakingNotifications::OnMatchAcceptance);
} }
else else
{ {
@ -126,7 +126,7 @@ namespace AWSGameLift
else else
{ {
AZ_Error(AWSGameLiftClientLocalTicketTrackerName, false, "Unable to find expected ticket with id %s", ticketId.c_str()); AZ_Error(AWSGameLiftClientLocalTicketTrackerName, false, "Unable to find expected ticket with id %s", ticketId.c_str());
AzFramework::MatchmakingNotificationBus::Broadcast(&AzFramework::MatchmakingNotifications::OnMatchError); Multiplayer::MatchmakingNotificationBus::Broadcast(&Multiplayer::MatchmakingNotifications::OnMatchError);
} }
} }
else else
@ -134,13 +134,13 @@ namespace AWSGameLift
AZ_Error(AWSGameLiftClientLocalTicketTrackerName, false, AWSGameLiftErrorMessageTemplate, AZ_Error(AWSGameLiftClientLocalTicketTrackerName, false, AWSGameLiftErrorMessageTemplate,
describeMatchmakingOutcome.GetError().GetExceptionName().c_str(), describeMatchmakingOutcome.GetError().GetExceptionName().c_str(),
describeMatchmakingOutcome.GetError().GetMessage().c_str()); describeMatchmakingOutcome.GetError().GetMessage().c_str());
AzFramework::MatchmakingNotificationBus::Broadcast(&AzFramework::MatchmakingNotifications::OnMatchError); Multiplayer::MatchmakingNotificationBus::Broadcast(&Multiplayer::MatchmakingNotifications::OnMatchError);
} }
} }
else else
{ {
AZ_Error(AWSGameLiftClientLocalTicketTrackerName, false, AWSGameLiftClientMissingErrorMessage); AZ_Error(AWSGameLiftClientLocalTicketTrackerName, false, AWSGameLiftClientMissingErrorMessage);
AzFramework::MatchmakingNotificationBus::Broadcast(&AzFramework::MatchmakingNotifications::OnMatchError); Multiplayer::MatchmakingNotificationBus::Broadcast(&Multiplayer::MatchmakingNotifications::OnMatchError);
} }
m_waitEvent.try_acquire_for(AZStd::chrono::milliseconds(m_pollingPeriodInMS)); m_waitEvent.try_acquire_for(AZStd::chrono::milliseconds(m_pollingPeriodInMS));
} }
@ -150,7 +150,7 @@ namespace AWSGameLift
const Aws::GameLift::Model::MatchmakingTicket& ticket, const AZStd::string& playerId) const Aws::GameLift::Model::MatchmakingTicket& ticket, const AZStd::string& playerId)
{ {
auto connectionInfo = ticket.GetGameSessionConnectionInfo(); auto connectionInfo = ticket.GetGameSessionConnectionInfo();
AzFramework::SessionConnectionConfig sessionConnectionConfig; Multiplayer::SessionConnectionConfig sessionConnectionConfig;
sessionConnectionConfig.m_ipAddress = connectionInfo.GetIpAddress().c_str(); sessionConnectionConfig.m_ipAddress = connectionInfo.GetIpAddress().c_str();
for (auto matchedPlayer : connectionInfo.GetMatchedPlayerSessions()) for (auto matchedPlayer : connectionInfo.GetMatchedPlayerSessions())
{ {
@ -168,7 +168,7 @@ namespace AWSGameLift
"Requesting and validating player session %s to connect to the match ...", "Requesting and validating player session %s to connect to the match ...",
sessionConnectionConfig.m_playerSessionId.c_str()); sessionConnectionConfig.m_playerSessionId.c_str());
bool result = bool result =
AZ::Interface<AzFramework::ISessionHandlingClientRequests>::Get()->RequestPlayerJoinSession(sessionConnectionConfig); AZ::Interface<Multiplayer::ISessionHandlingClientRequests>::Get()->RequestPlayerJoinSession(sessionConnectionConfig);
if (result) if (result)
{ {
AZ_TracePrintf(AWSGameLiftClientLocalTicketTrackerName, AZ_TracePrintf(AWSGameLiftClientLocalTicketTrackerName,

@ -10,7 +10,7 @@
#include <AzCore/Interface/Interface.h> #include <AzCore/Interface/Interface.h>
#include <AzCore/Jobs/JobFunction.h> #include <AzCore/Jobs/JobFunction.h>
#include <AzCore/std/smart_ptr/make_shared.h> #include <AzCore/std/smart_ptr/make_shared.h>
#include <AzFramework/Session/SessionConfig.h> #include <Multiplayer/Session/SessionConfig.h>
#include <AWSCoreBus.h> #include <AWSCoreBus.h>
#include <Credential/AWSCredentialBus.h> #include <Credential/AWSCredentialBus.h>
@ -42,32 +42,32 @@ namespace AWSGameLift
AZ::Interface<IAWSGameLiftRequests>::Register(this); AZ::Interface<IAWSGameLiftRequests>::Register(this);
AWSGameLiftRequestBus::Handler::BusConnect(); AWSGameLiftRequestBus::Handler::BusConnect();
AZ::Interface<AzFramework::ISessionAsyncRequests>::Register(this); AZ::Interface<Multiplayer::ISessionAsyncRequests>::Register(this);
AWSGameLiftSessionAsyncRequestBus::Handler::BusConnect(); AWSGameLiftSessionAsyncRequestBus::Handler::BusConnect();
AZ::Interface<AzFramework::ISessionRequests>::Register(this); AZ::Interface<Multiplayer::ISessionRequests>::Register(this);
AWSGameLiftSessionRequestBus::Handler::BusConnect(); AWSGameLiftSessionRequestBus::Handler::BusConnect();
AZ::Interface<AzFramework::IMatchmakingAsyncRequests>::Register(this); AZ::Interface<Multiplayer::IMatchmakingAsyncRequests>::Register(this);
AWSGameLiftMatchmakingAsyncRequestBus::Handler::BusConnect(); AWSGameLiftMatchmakingAsyncRequestBus::Handler::BusConnect();
AZ::Interface<AzFramework::IMatchmakingRequests>::Register(this); AZ::Interface<Multiplayer::IMatchmakingRequests>::Register(this);
AWSGameLiftMatchmakingRequestBus::Handler::BusConnect(); AWSGameLiftMatchmakingRequestBus::Handler::BusConnect();
} }
void AWSGameLiftClientManager::DeactivateManager() void AWSGameLiftClientManager::DeactivateManager()
{ {
AWSGameLiftMatchmakingRequestBus::Handler::BusDisconnect(); AWSGameLiftMatchmakingRequestBus::Handler::BusDisconnect();
AZ::Interface<AzFramework::IMatchmakingRequests>::Unregister(this); AZ::Interface<Multiplayer::IMatchmakingRequests>::Unregister(this);
AWSGameLiftMatchmakingAsyncRequestBus::Handler::BusDisconnect(); AWSGameLiftMatchmakingAsyncRequestBus::Handler::BusDisconnect();
AZ::Interface<AzFramework::IMatchmakingAsyncRequests>::Unregister(this); AZ::Interface<Multiplayer::IMatchmakingAsyncRequests>::Unregister(this);
AWSGameLiftSessionRequestBus::Handler::BusDisconnect(); AWSGameLiftSessionRequestBus::Handler::BusDisconnect();
AZ::Interface<AzFramework::ISessionRequests>::Unregister(this); AZ::Interface<Multiplayer::ISessionRequests>::Unregister(this);
AWSGameLiftSessionAsyncRequestBus::Handler::BusDisconnect(); AWSGameLiftSessionAsyncRequestBus::Handler::BusDisconnect();
AZ::Interface<AzFramework::ISessionAsyncRequests>::Unregister(this); AZ::Interface<Multiplayer::ISessionAsyncRequests>::Unregister(this);
AWSGameLiftRequestBus::Handler::BusDisconnect(); AWSGameLiftRequestBus::Handler::BusDisconnect();
AZ::Interface<IAWSGameLiftRequests>::Unregister(this); AZ::Interface<IAWSGameLiftRequests>::Unregister(this);
@ -133,7 +133,7 @@ namespace AWSGameLift
return AZ::Uuid::CreateRandom().ToString<AZStd::string>(includeBrackets, includeDashes); return AZ::Uuid::CreateRandom().ToString<AZStd::string>(includeBrackets, includeDashes);
} }
void AWSGameLiftClientManager::AcceptMatch(const AzFramework::AcceptMatchRequest& acceptMatchRequest) void AWSGameLiftClientManager::AcceptMatch(const Multiplayer::AcceptMatchRequest& acceptMatchRequest)
{ {
if (AcceptMatchActivity::ValidateAcceptMatchRequest(acceptMatchRequest)) if (AcceptMatchActivity::ValidateAcceptMatchRequest(acceptMatchRequest))
{ {
@ -143,12 +143,12 @@ namespace AWSGameLift
} }
} }
void AWSGameLiftClientManager::AcceptMatchAsync(const AzFramework::AcceptMatchRequest& acceptMatchRequest) void AWSGameLiftClientManager::AcceptMatchAsync(const Multiplayer::AcceptMatchRequest& acceptMatchRequest)
{ {
if (!AcceptMatchActivity::ValidateAcceptMatchRequest(acceptMatchRequest)) if (!AcceptMatchActivity::ValidateAcceptMatchRequest(acceptMatchRequest))
{ {
AzFramework::MatchmakingAsyncRequestNotificationBus::Broadcast( Multiplayer::MatchmakingAsyncRequestNotificationBus::Broadcast(
&AzFramework::MatchmakingAsyncRequestNotifications::OnAcceptMatchAsyncComplete); &Multiplayer::MatchmakingAsyncRequestNotifications::OnAcceptMatchAsyncComplete);
return; return;
} }
@ -161,15 +161,15 @@ namespace AWSGameLift
{ {
AcceptMatchActivity::AcceptMatch(gameliftStartMatchmakingRequest); AcceptMatchActivity::AcceptMatch(gameliftStartMatchmakingRequest);
AzFramework::MatchmakingAsyncRequestNotificationBus::Broadcast( Multiplayer::MatchmakingAsyncRequestNotificationBus::Broadcast(
&AzFramework::MatchmakingAsyncRequestNotifications::OnAcceptMatchAsyncComplete); &Multiplayer::MatchmakingAsyncRequestNotifications::OnAcceptMatchAsyncComplete);
}, },
true, jobContext); true, jobContext);
acceptMatchJob->Start(); acceptMatchJob->Start();
} }
AZStd::string AWSGameLiftClientManager::CreateSession(const AzFramework::CreateSessionRequest& createSessionRequest) AZStd::string AWSGameLiftClientManager::CreateSession(const Multiplayer::CreateSessionRequest& createSessionRequest)
{ {
AZStd::string result = ""; AZStd::string result = "";
if (CreateSessionActivity::ValidateCreateSessionRequest(createSessionRequest)) if (CreateSessionActivity::ValidateCreateSessionRequest(createSessionRequest))
@ -192,7 +192,7 @@ namespace AWSGameLift
return result; return result;
} }
void AWSGameLiftClientManager::CreateSessionAsync(const AzFramework::CreateSessionRequest& createSessionRequest) void AWSGameLiftClientManager::CreateSessionAsync(const Multiplayer::CreateSessionRequest& createSessionRequest)
{ {
if (CreateSessionActivity::ValidateCreateSessionRequest(createSessionRequest)) if (CreateSessionActivity::ValidateCreateSessionRequest(createSessionRequest))
{ {
@ -206,8 +206,8 @@ namespace AWSGameLift
{ {
AZStd::string result = CreateSessionActivity::CreateSession(gameliftCreateSessionRequest); AZStd::string result = CreateSessionActivity::CreateSession(gameliftCreateSessionRequest);
AzFramework::SessionAsyncRequestNotificationBus::Broadcast( Multiplayer::SessionAsyncRequestNotificationBus::Broadcast(
&AzFramework::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, result); &Multiplayer::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, result);
}, },
true, jobContext); true, jobContext);
createSessionJob->Start(); createSessionJob->Start();
@ -224,8 +224,8 @@ namespace AWSGameLift
{ {
AZStd::string result = CreateSessionOnQueueActivity::CreateSessionOnQueue(gameliftCreateSessionOnQueueRequest); AZStd::string result = CreateSessionOnQueueActivity::CreateSessionOnQueue(gameliftCreateSessionOnQueueRequest);
AzFramework::SessionAsyncRequestNotificationBus::Broadcast( Multiplayer::SessionAsyncRequestNotificationBus::Broadcast(
&AzFramework::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, result); &Multiplayer::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, result);
}, },
true, jobContext); true, jobContext);
createSessionOnQueueJob->Start(); createSessionOnQueueJob->Start();
@ -233,12 +233,12 @@ namespace AWSGameLift
else else
{ {
AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftCreateSessionRequestInvalidErrorMessage); AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftCreateSessionRequestInvalidErrorMessage);
AzFramework::SessionAsyncRequestNotificationBus::Broadcast( Multiplayer::SessionAsyncRequestNotificationBus::Broadcast(
&AzFramework::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, ""); &Multiplayer::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, "");
} }
} }
bool AWSGameLiftClientManager::JoinSession(const AzFramework::JoinSessionRequest& joinSessionRequest) bool AWSGameLiftClientManager::JoinSession(const Multiplayer::JoinSessionRequest& joinSessionRequest)
{ {
bool result = false; bool result = false;
if (JoinSessionActivity::ValidateJoinSessionRequest(joinSessionRequest)) if (JoinSessionActivity::ValidateJoinSessionRequest(joinSessionRequest))
@ -252,12 +252,12 @@ namespace AWSGameLift
return result; return result;
} }
void AWSGameLiftClientManager::JoinSessionAsync(const AzFramework::JoinSessionRequest& joinSessionRequest) void AWSGameLiftClientManager::JoinSessionAsync(const Multiplayer::JoinSessionRequest& joinSessionRequest)
{ {
if (!JoinSessionActivity::ValidateJoinSessionRequest(joinSessionRequest)) if (!JoinSessionActivity::ValidateJoinSessionRequest(joinSessionRequest))
{ {
AzFramework::SessionAsyncRequestNotificationBus::Broadcast( Multiplayer::SessionAsyncRequestNotificationBus::Broadcast(
&AzFramework::SessionAsyncRequestNotifications::OnJoinSessionAsyncComplete, false); &Multiplayer::SessionAsyncRequestNotifications::OnJoinSessionAsyncComplete, false);
return; return;
} }
@ -272,8 +272,8 @@ namespace AWSGameLift
auto createPlayerSessionOutcome = JoinSessionActivity::CreatePlayerSession(gameliftJoinSessionRequest); auto createPlayerSessionOutcome = JoinSessionActivity::CreatePlayerSession(gameliftJoinSessionRequest);
bool result = JoinSessionActivity::RequestPlayerJoinSession(createPlayerSessionOutcome); bool result = JoinSessionActivity::RequestPlayerJoinSession(createPlayerSessionOutcome);
AzFramework::SessionAsyncRequestNotificationBus::Broadcast( Multiplayer::SessionAsyncRequestNotificationBus::Broadcast(
&AzFramework::SessionAsyncRequestNotifications::OnJoinSessionAsyncComplete, result); &Multiplayer::SessionAsyncRequestNotifications::OnJoinSessionAsyncComplete, result);
}, },
true, jobContext); true, jobContext);
@ -293,18 +293,18 @@ namespace AWSGameLift
[this]() [this]()
{ {
LeaveSession(); LeaveSession();
AzFramework::SessionAsyncRequestNotificationBus::Broadcast( Multiplayer::SessionAsyncRequestNotificationBus::Broadcast(
&AzFramework::SessionAsyncRequestNotifications::OnLeaveSessionAsyncComplete); &Multiplayer::SessionAsyncRequestNotifications::OnLeaveSessionAsyncComplete);
}, },
true, jobContext); true, jobContext);
leaveSessionJob->Start(); leaveSessionJob->Start();
} }
AzFramework::SearchSessionsResponse AWSGameLiftClientManager::SearchSessions( Multiplayer::SearchSessionsResponse AWSGameLiftClientManager::SearchSessions(
const AzFramework::SearchSessionsRequest& searchSessionsRequest) const const Multiplayer::SearchSessionsRequest& searchSessionsRequest) const
{ {
AzFramework::SearchSessionsResponse response; Multiplayer::SearchSessionsResponse response;
if (SearchSessionsActivity::ValidateSearchSessionsRequest(searchSessionsRequest)) if (SearchSessionsActivity::ValidateSearchSessionsRequest(searchSessionsRequest))
{ {
const AWSGameLiftSearchSessionsRequest& gameliftSearchSessionsRequest = const AWSGameLiftSearchSessionsRequest& gameliftSearchSessionsRequest =
@ -315,12 +315,12 @@ namespace AWSGameLift
return response; return response;
} }
void AWSGameLiftClientManager::SearchSessionsAsync(const AzFramework::SearchSessionsRequest& searchSessionsRequest) const void AWSGameLiftClientManager::SearchSessionsAsync(const Multiplayer::SearchSessionsRequest& searchSessionsRequest) const
{ {
if (!SearchSessionsActivity::ValidateSearchSessionsRequest(searchSessionsRequest)) if (!SearchSessionsActivity::ValidateSearchSessionsRequest(searchSessionsRequest))
{ {
AzFramework::SessionAsyncRequestNotificationBus::Broadcast( Multiplayer::SessionAsyncRequestNotificationBus::Broadcast(
&AzFramework::SessionAsyncRequestNotifications::OnSearchSessionsAsyncComplete, AzFramework::SearchSessionsResponse()); &Multiplayer::SessionAsyncRequestNotifications::OnSearchSessionsAsyncComplete, Multiplayer::SearchSessionsResponse());
return; return;
} }
@ -332,17 +332,17 @@ namespace AWSGameLift
AZ::Job* searchSessionsJob = AZ::CreateJobFunction( AZ::Job* searchSessionsJob = AZ::CreateJobFunction(
[gameliftSearchSessionsRequest]() [gameliftSearchSessionsRequest]()
{ {
AzFramework::SearchSessionsResponse response = SearchSessionsActivity::SearchSessions(gameliftSearchSessionsRequest); Multiplayer::SearchSessionsResponse response = SearchSessionsActivity::SearchSessions(gameliftSearchSessionsRequest);
AzFramework::SessionAsyncRequestNotificationBus::Broadcast( Multiplayer::SessionAsyncRequestNotificationBus::Broadcast(
&AzFramework::SessionAsyncRequestNotifications::OnSearchSessionsAsyncComplete, response); &Multiplayer::SessionAsyncRequestNotifications::OnSearchSessionsAsyncComplete, response);
}, },
true, jobContext); true, jobContext);
searchSessionsJob->Start(); searchSessionsJob->Start();
} }
AZStd::string AWSGameLiftClientManager::StartMatchmaking(const AzFramework::StartMatchmakingRequest& startMatchmakingRequest) AZStd::string AWSGameLiftClientManager::StartMatchmaking(const Multiplayer::StartMatchmakingRequest& startMatchmakingRequest)
{ {
AZStd::string response; AZStd::string response;
if (StartMatchmakingActivity::ValidateStartMatchmakingRequest(startMatchmakingRequest)) if (StartMatchmakingActivity::ValidateStartMatchmakingRequest(startMatchmakingRequest))
@ -355,12 +355,12 @@ namespace AWSGameLift
return response; return response;
} }
void AWSGameLiftClientManager::StartMatchmakingAsync(const AzFramework::StartMatchmakingRequest& startMatchmakingRequest) void AWSGameLiftClientManager::StartMatchmakingAsync(const Multiplayer::StartMatchmakingRequest& startMatchmakingRequest)
{ {
if (!StartMatchmakingActivity::ValidateStartMatchmakingRequest(startMatchmakingRequest)) if (!StartMatchmakingActivity::ValidateStartMatchmakingRequest(startMatchmakingRequest))
{ {
AzFramework::MatchmakingAsyncRequestNotificationBus::Broadcast( Multiplayer::MatchmakingAsyncRequestNotificationBus::Broadcast(
&AzFramework::MatchmakingAsyncRequestNotifications::OnStartMatchmakingAsyncComplete, AZStd::string{}); &Multiplayer::MatchmakingAsyncRequestNotifications::OnStartMatchmakingAsyncComplete, AZStd::string{});
return; return;
} }
@ -374,15 +374,15 @@ namespace AWSGameLift
{ {
AZStd::string response = StartMatchmakingActivity::StartMatchmaking(gameliftStartMatchmakingRequest); AZStd::string response = StartMatchmakingActivity::StartMatchmaking(gameliftStartMatchmakingRequest);
AzFramework::MatchmakingAsyncRequestNotificationBus::Broadcast( Multiplayer::MatchmakingAsyncRequestNotificationBus::Broadcast(
&AzFramework::MatchmakingAsyncRequestNotifications::OnStartMatchmakingAsyncComplete, response); &Multiplayer::MatchmakingAsyncRequestNotifications::OnStartMatchmakingAsyncComplete, response);
}, },
true, jobContext); true, jobContext);
startMatchmakingJob->Start(); startMatchmakingJob->Start();
} }
void AWSGameLiftClientManager::StopMatchmaking(const AzFramework::StopMatchmakingRequest& stopMatchmakingRequest) void AWSGameLiftClientManager::StopMatchmaking(const Multiplayer::StopMatchmakingRequest& stopMatchmakingRequest)
{ {
if (StopMatchmakingActivity::ValidateStopMatchmakingRequest(stopMatchmakingRequest)) if (StopMatchmakingActivity::ValidateStopMatchmakingRequest(stopMatchmakingRequest))
{ {
@ -393,12 +393,12 @@ namespace AWSGameLift
} }
} }
void AWSGameLiftClientManager::StopMatchmakingAsync(const AzFramework::StopMatchmakingRequest& stopMatchmakingRequest) void AWSGameLiftClientManager::StopMatchmakingAsync(const Multiplayer::StopMatchmakingRequest& stopMatchmakingRequest)
{ {
if (!StopMatchmakingActivity::ValidateStopMatchmakingRequest(stopMatchmakingRequest)) if (!StopMatchmakingActivity::ValidateStopMatchmakingRequest(stopMatchmakingRequest))
{ {
AzFramework::MatchmakingAsyncRequestNotificationBus::Broadcast( Multiplayer::MatchmakingAsyncRequestNotificationBus::Broadcast(
&AzFramework::MatchmakingAsyncRequestNotifications::OnStopMatchmakingAsyncComplete); &Multiplayer::MatchmakingAsyncRequestNotifications::OnStopMatchmakingAsyncComplete);
return; return;
} }
@ -412,8 +412,8 @@ namespace AWSGameLift
{ {
StopMatchmakingActivity::StopMatchmaking(gameliftStopMatchmakingRequest); StopMatchmakingActivity::StopMatchmaking(gameliftStopMatchmakingRequest);
AzFramework::MatchmakingAsyncRequestNotificationBus::Broadcast( Multiplayer::MatchmakingAsyncRequestNotificationBus::Broadcast(
&AzFramework::MatchmakingAsyncRequestNotifications::OnStopMatchmakingAsyncComplete); &Multiplayer::MatchmakingAsyncRequestNotifications::OnStopMatchmakingAsyncComplete);
}, },
true, jobContext); true, jobContext);

@ -10,7 +10,7 @@
#include <AzCore/RTTI/BehaviorContext.h> #include <AzCore/RTTI/BehaviorContext.h>
#include <AzCore/std/smart_ptr/shared_ptr.h> #include <AzCore/std/smart_ptr/shared_ptr.h>
#include <AzFramework/Matchmaking/MatchmakingNotifications.h> #include <Multiplayer/Session/MatchmakingNotifications.h>
#include <Request/AWSGameLiftRequestBus.h> #include <Request/AWSGameLiftRequestBus.h>
#include <Request/AWSGameLiftSessionRequestBus.h> #include <Request/AWSGameLiftSessionRequestBus.h>
@ -28,7 +28,7 @@ namespace AWSGameLift
// MatchmakingNotificationBus EBus handler for scripting // MatchmakingNotificationBus EBus handler for scripting
class AWSGameLiftMatchmakingNotificationBusHandler class AWSGameLiftMatchmakingNotificationBusHandler
: public AzFramework::MatchmakingNotificationBus::Handler : public Multiplayer::MatchmakingNotificationBus::Handler
, public AZ::BehaviorEBusHandler , public AZ::BehaviorEBusHandler
{ {
public: public:
@ -61,7 +61,7 @@ namespace AWSGameLift
// MatchmakingAsyncRequestNotificationBus EBus handler for scripting // MatchmakingAsyncRequestNotificationBus EBus handler for scripting
class AWSGameLiftMatchmakingAsyncRequestNotificationBusHandler class AWSGameLiftMatchmakingAsyncRequestNotificationBusHandler
: public AzFramework::MatchmakingAsyncRequestNotificationBus::Handler : public Multiplayer::MatchmakingAsyncRequestNotificationBus::Handler
, public AZ::BehaviorEBusHandler , public AZ::BehaviorEBusHandler
{ {
public: public:
@ -91,7 +91,7 @@ namespace AWSGameLift
// SessionAsyncRequestNotificationBus EBus handler for scripting // SessionAsyncRequestNotificationBus EBus handler for scripting
class AWSGameLiftSessionAsyncRequestNotificationBusHandler class AWSGameLiftSessionAsyncRequestNotificationBusHandler
: public AzFramework::SessionAsyncRequestNotificationBus::Handler : public Multiplayer::SessionAsyncRequestNotificationBus::Handler
, public AZ::BehaviorEBusHandler , public AZ::BehaviorEBusHandler
{ {
public: public:
@ -109,7 +109,7 @@ namespace AWSGameLift
Call(FN_OnCreateSessionAsyncComplete, createSessionReponse); Call(FN_OnCreateSessionAsyncComplete, createSessionReponse);
} }
void OnSearchSessionsAsyncComplete(const AzFramework::SearchSessionsResponse& searchSessionsResponse) override void OnSearchSessionsAsyncComplete(const Multiplayer::SearchSessionsResponse& searchSessionsResponse) override
{ {
Call(FN_OnSearchSessionsAsyncComplete, searchSessionsResponse); Call(FN_OnSearchSessionsAsyncComplete, searchSessionsResponse);
} }
@ -155,25 +155,25 @@ namespace AWSGameLift
AZStd::string CreatePlayerId(bool includeBrackets, bool includeDashes) override; AZStd::string CreatePlayerId(bool includeBrackets, bool includeDashes) override;
// AWSGameLiftMatchmakingAsyncRequestBus interface implementation // AWSGameLiftMatchmakingAsyncRequestBus interface implementation
void AcceptMatchAsync(const AzFramework::AcceptMatchRequest& acceptMatchRequest) override; void AcceptMatchAsync(const Multiplayer::AcceptMatchRequest& acceptMatchRequest) override;
void StartMatchmakingAsync(const AzFramework::StartMatchmakingRequest& startMatchmakingRequest) override; void StartMatchmakingAsync(const Multiplayer::StartMatchmakingRequest& startMatchmakingRequest) override;
void StopMatchmakingAsync(const AzFramework::StopMatchmakingRequest& stopMatchmakingRequest) override; void StopMatchmakingAsync(const Multiplayer::StopMatchmakingRequest& stopMatchmakingRequest) override;
// AWSGameLiftSessionAsyncRequestBus interface implementation // AWSGameLiftSessionAsyncRequestBus interface implementation
void CreateSessionAsync(const AzFramework::CreateSessionRequest& createSessionRequest) override; void CreateSessionAsync(const Multiplayer::CreateSessionRequest& createSessionRequest) override;
void JoinSessionAsync(const AzFramework::JoinSessionRequest& joinSessionRequest) override; void JoinSessionAsync(const Multiplayer::JoinSessionRequest& joinSessionRequest) override;
void SearchSessionsAsync(const AzFramework::SearchSessionsRequest& searchSessionsRequest) const override; void SearchSessionsAsync(const Multiplayer::SearchSessionsRequest& searchSessionsRequest) const override;
void LeaveSessionAsync() override; void LeaveSessionAsync() override;
// AWSGameLiftMatchmakingRequestBus interface implementation // AWSGameLiftMatchmakingRequestBus interface implementation
void AcceptMatch(const AzFramework::AcceptMatchRequest& acceptMatchRequest) override; void AcceptMatch(const Multiplayer::AcceptMatchRequest& acceptMatchRequest) override;
AZStd::string StartMatchmaking(const AzFramework::StartMatchmakingRequest& startMatchmakingRequest) override; AZStd::string StartMatchmaking(const Multiplayer::StartMatchmakingRequest& startMatchmakingRequest) override;
void StopMatchmaking(const AzFramework::StopMatchmakingRequest& stopMatchmakingRequest) override; void StopMatchmaking(const Multiplayer::StopMatchmakingRequest& stopMatchmakingRequest) override;
// AWSGameLiftSessionRequestBus interface implementation // AWSGameLiftSessionRequestBus interface implementation
AZStd::string CreateSession(const AzFramework::CreateSessionRequest& createSessionRequest) override; AZStd::string CreateSession(const Multiplayer::CreateSessionRequest& createSessionRequest) override;
bool JoinSession(const AzFramework::JoinSessionRequest& joinSessionRequest) override; bool JoinSession(const Multiplayer::JoinSessionRequest& joinSessionRequest) override;
AzFramework::SearchSessionsResponse SearchSessions(const AzFramework::SearchSessionsRequest& searchSessionsRequest) const override; Multiplayer::SearchSessionsResponse SearchSessions(const Multiplayer::SearchSessionsRequest& searchSessionsRequest) const override;
void LeaveSession() override; void LeaveSession() override;
}; };
} // namespace AWSGameLift } // namespace AWSGameLift

@ -10,7 +10,7 @@
#include <AzCore/Serialization/SerializeContext.h> #include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/Serialization/EditContext.h> #include <AzCore/Serialization/EditContext.h>
#include <AzCore/Serialization/EditContextConstants.inl> #include <AzCore/Serialization/EditContextConstants.inl>
#include <AzFramework/Session/SessionConfig.h> #include <Multiplayer/Session/SessionConfig.h>
#include <AWSGameLiftClientLocalTicketTracker.h> #include <AWSGameLiftClientLocalTicketTracker.h>
#include <AWSCoreBus.h> #include <AWSCoreBus.h>
@ -129,7 +129,7 @@ namespace AWSGameLift
->Event("StopMatchmakingAsync", &AWSGameLiftMatchmakingAsyncRequestBus::Events::StopMatchmakingAsync, ->Event("StopMatchmakingAsync", &AWSGameLiftMatchmakingAsyncRequestBus::Events::StopMatchmakingAsync,
{ { { "StopMatchmakingRequest", "" } } }); { { { "StopMatchmakingRequest", "" } } });
behaviorContext->EBus<AzFramework::MatchmakingAsyncRequestNotificationBus>("AWSGameLiftMatchmakingAsyncRequestNotificationBus") behaviorContext->EBus<Multiplayer::MatchmakingAsyncRequestNotificationBus>("AWSGameLiftMatchmakingAsyncRequestNotificationBus")
->Attribute(AZ::Script::Attributes::Category, "AWSGameLift/Matchmaking") ->Attribute(AZ::Script::Attributes::Category, "AWSGameLift/Matchmaking")
->Handler<AWSGameLiftMatchmakingAsyncRequestNotificationBusHandler>(); ->Handler<AWSGameLiftMatchmakingAsyncRequestNotificationBusHandler>();
@ -149,7 +149,7 @@ namespace AWSGameLift
{ "PlayerId", "" } } }) { "PlayerId", "" } } })
->Event("StopPolling", &AWSGameLiftMatchmakingEventRequestBus::Events::StopPolling); ->Event("StopPolling", &AWSGameLiftMatchmakingEventRequestBus::Events::StopPolling);
behaviorContext->EBus<AzFramework::MatchmakingNotificationBus>("AWSGameLiftMatchmakingNotificationBus") behaviorContext->EBus<Multiplayer::MatchmakingNotificationBus>("AWSGameLiftMatchmakingNotificationBus")
->Attribute(AZ::Script::Attributes::Category, "AWSGameLift/Matchmaking") ->Attribute(AZ::Script::Attributes::Category, "AWSGameLift/Matchmaking")
->Handler<AWSGameLiftMatchmakingNotificationBusHandler>(); ->Handler<AWSGameLiftMatchmakingNotificationBusHandler>();
} }
@ -175,7 +175,7 @@ namespace AWSGameLift
{ { { "SearchSessionsRequest", "" } } }) { { { "SearchSessionsRequest", "" } } })
->Event("LeaveSessionAsync", &AWSGameLiftSessionAsyncRequestBus::Events::LeaveSessionAsync); ->Event("LeaveSessionAsync", &AWSGameLiftSessionAsyncRequestBus::Events::LeaveSessionAsync);
behaviorContext->EBus<AzFramework::SessionAsyncRequestNotificationBus>("AWSGameLiftSessionAsyncRequestNotificationBus") behaviorContext->EBus<Multiplayer::SessionAsyncRequestNotificationBus>("AWSGameLiftSessionAsyncRequestNotificationBus")
->Attribute(AZ::Script::Attributes::Category, "AWSGameLift/Session") ->Attribute(AZ::Script::Attributes::Category, "AWSGameLift/Session")
->Handler<AWSGameLiftSessionAsyncRequestNotificationBusHandler>(); ->Handler<AWSGameLiftSessionAsyncRequestNotificationBusHandler>();
@ -190,10 +190,10 @@ namespace AWSGameLift
void AWSGameLiftClientSystemComponent::ReflectCreateSessionRequest(AZ::ReflectContext* context) void AWSGameLiftClientSystemComponent::ReflectCreateSessionRequest(AZ::ReflectContext* context)
{ {
AzFramework::CreateSessionRequest::Reflect(context); Multiplayer::CreateSessionRequest::Reflect(context);
if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context)) if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
{ {
behaviorContext->Class<AzFramework::CreateSessionRequest>("CreateSessionRequest") behaviorContext->Class<Multiplayer::CreateSessionRequest>("CreateSessionRequest")
->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value) ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value)
// Expose base type to BehaviorContext, but hide it to be used directly // Expose base type to BehaviorContext, but hide it to be used directly
->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All)
@ -204,34 +204,34 @@ namespace AWSGameLift
void AWSGameLiftClientSystemComponent::ReflectSearchSessionsResponse(AZ::ReflectContext* context) void AWSGameLiftClientSystemComponent::ReflectSearchSessionsResponse(AZ::ReflectContext* context)
{ {
// As it is a common response type, reflection could be moved to AzFramework to avoid duplication // As it is a common response type, reflection could be moved to AzFramework to avoid duplication
AzFramework::SessionConfig::Reflect(context); Multiplayer::SessionConfig::Reflect(context);
AzFramework::SearchSessionsResponse::Reflect(context); Multiplayer::SearchSessionsResponse::Reflect(context);
if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context)) if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
{ {
behaviorContext->Class<AzFramework::SessionConfig>("SessionConfig") behaviorContext->Class<Multiplayer::SessionConfig>("SessionConfig")
->Attribute(AZ::Script::Attributes::Category, "Session") ->Attribute(AZ::Script::Attributes::Category, "Session")
->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value) ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value)
->Property("CreationTime", BehaviorValueProperty(&AzFramework::SessionConfig::m_creationTime)) ->Property("CreationTime", BehaviorValueProperty(&Multiplayer::SessionConfig::m_creationTime))
->Property("CreatorId", BehaviorValueProperty(&AzFramework::SessionConfig::m_creatorId)) ->Property("CreatorId", BehaviorValueProperty(&Multiplayer::SessionConfig::m_creatorId))
->Property("CurrentPlayer", BehaviorValueProperty(&AzFramework::SessionConfig::m_currentPlayer)) ->Property("CurrentPlayer", BehaviorValueProperty(&Multiplayer::SessionConfig::m_currentPlayer))
->Property("DnsName", BehaviorValueProperty(&AzFramework::SessionConfig::m_dnsName)) ->Property("DnsName", BehaviorValueProperty(&Multiplayer::SessionConfig::m_dnsName))
->Property("IpAddress", BehaviorValueProperty(&AzFramework::SessionConfig::m_ipAddress)) ->Property("IpAddress", BehaviorValueProperty(&Multiplayer::SessionConfig::m_ipAddress))
->Property("MaxPlayer", BehaviorValueProperty(&AzFramework::SessionConfig::m_maxPlayer)) ->Property("MaxPlayer", BehaviorValueProperty(&Multiplayer::SessionConfig::m_maxPlayer))
->Property("Port", BehaviorValueProperty(&AzFramework::SessionConfig::m_port)) ->Property("Port", BehaviorValueProperty(&Multiplayer::SessionConfig::m_port))
->Property("SessionId", BehaviorValueProperty(&AzFramework::SessionConfig::m_sessionId)) ->Property("SessionId", BehaviorValueProperty(&Multiplayer::SessionConfig::m_sessionId))
->Property("SessionName", BehaviorValueProperty(&AzFramework::SessionConfig::m_sessionName)) ->Property("SessionName", BehaviorValueProperty(&Multiplayer::SessionConfig::m_sessionName))
->Property("SessionProperties", BehaviorValueProperty(&AzFramework::SessionConfig::m_sessionProperties)) ->Property("SessionProperties", BehaviorValueProperty(&Multiplayer::SessionConfig::m_sessionProperties))
->Property("MatchmakingData", BehaviorValueProperty(&AzFramework::SessionConfig::m_matchmakingData)) ->Property("MatchmakingData", BehaviorValueProperty(&Multiplayer::SessionConfig::m_matchmakingData))
->Property("Status", BehaviorValueProperty(&AzFramework::SessionConfig::m_status)) ->Property("Status", BehaviorValueProperty(&Multiplayer::SessionConfig::m_status))
->Property("StatusReason", BehaviorValueProperty(&AzFramework::SessionConfig::m_statusReason)) ->Property("StatusReason", BehaviorValueProperty(&Multiplayer::SessionConfig::m_statusReason))
->Property("TerminationTime", BehaviorValueProperty(&AzFramework::SessionConfig::m_terminationTime)) ->Property("TerminationTime", BehaviorValueProperty(&Multiplayer::SessionConfig::m_terminationTime))
; ;
behaviorContext->Class<AzFramework::SearchSessionsResponse>("SearchSessionsResponse") behaviorContext->Class<Multiplayer::SearchSessionsResponse>("SearchSessionsResponse")
->Attribute(AZ::Script::Attributes::Category, "Session") ->Attribute(AZ::Script::Attributes::Category, "Session")
->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value) ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value)
->Property("NextToken", BehaviorValueProperty(&AzFramework::SearchSessionsResponse::m_nextToken)) ->Property("NextToken", BehaviorValueProperty(&Multiplayer::SearchSessionsResponse::m_nextToken))
->Property("SessionConfigs", BehaviorValueProperty(&AzFramework::SearchSessionsResponse::m_sessionConfigs)) ->Property("SessionConfigs", BehaviorValueProperty(&Multiplayer::SearchSessionsResponse::m_sessionConfigs))
; ;
} }
} }

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save