123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- """
- 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
- """
- class MacroMaterialTests:
- setup_test = (
- "Setup successful",
- "Setup failed"
- )
- material_changed_not_called_when_inactive = (
- "OnTerrainMacroMaterialRegionChanged not called successfully",
- "OnTerrainMacroMaterialRegionChanged called when component inactive."
- )
- material_created = (
- "MaterialCreated called successfully",
- "MaterialCreated failed"
- )
- material_destroyed = (
- "MaterialDestroyed called successfully",
- "MaterialDestroyed failed"
- )
- material_recreated = (
- "MaterialCreated called successfully on second test",
- "MaterialCreated failed on second test"
- )
- material_changed_call_on_aabb_change = (
- "OnTerrainMacroMaterialRegionChanged called successfully",
- "Timed out waiting for OnTerrainMacroMaterialRegionChanged"
- )
- def TerrainMacroMaterialComponent_MacroMaterialActivates():
- """
- Summary:
- Load an empty level, create a MacroMaterialComponent and check assigning textures results in the correct callbacks.
- :return: None
- """
- import os
- import azlmbr.legacy.general as general
- import azlmbr.asset as asset
- import azlmbr.bus as bus
- import azlmbr.math as math
- import azlmbr.terrain as terrain
- import azlmbr.editor as editor
- 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 TestHelper as helper
- from editor_python_test_tools.editor_entity_utils import EditorEntity
- material_created_called = False
- material_changed_called = False
- material_region_changed_called = False
- material_destroyed_called = False
- def create_entity_at(entity_name, components_to_add, x, y, z):
- entity = EditorEntity.create_editor_entity_at([x, y, z], entity_name)
- for component in components_to_add:
- entity.add_component(component)
- return entity
-
- def on_macro_material_created(args):
- nonlocal material_created_called
- material_created_called = True
- def on_macro_material_changed(args):
- nonlocal material_changed_called
- material_changed_called = True
- def on_macro_material_region_changed(args):
- nonlocal material_region_changed_called
- material_region_changed_called = True
- def on_macro_material_destroyed(args):
- nonlocal material_destroyed_called
- material_destroyed_called = True
- # Open a level.
- hydra.open_base_level()
-
- general.idle_wait_frames(1)
- # Set up a handler to wait for notifications from the TerrainSystem.
- handler = terrain.TerrainMacroMaterialAutomationBusHandler()
- handler.connect()
- handler.add_callback("OnTerrainMacroMaterialCreated", on_macro_material_created)
- handler.add_callback("OnTerrainMacroMaterialChanged", on_macro_material_changed)
- handler.add_callback("OnTerrainMacroMaterialRegionChanged", on_macro_material_region_changed)
- handler.add_callback("OnTerrainMacroMaterialDestroyed", on_macro_material_destroyed)
- macro_material_entity = create_entity_at("macro", ["Terrain Macro Material", "Axis Aligned Box Shape"], 0.0, 0.0, 0.0)
- # Check that no macro material callbacks happened. It should be "inactive" as it has no assets assigned.
- setup_success = not material_created_called and not material_changed_called and not material_region_changed_called and not material_destroyed_called
- Report.result(MacroMaterialTests.setup_test, setup_success)
- # Find the aabb component.
- aabb_component_type_id_type = azlmbr.editor.EditorComponentAPIBus(azlmbr.bus.Broadcast, 'FindComponentTypeIdsByEntityType', ["Axis Aligned Box Shape"], 0)[0]
- aabb_component_id = azlmbr.editor.EditorComponentAPIBus(azlmbr.bus.Broadcast, 'GetComponentOfType', macro_material_entity.id, aabb_component_type_id_type).GetValue()
-
- # Change the aabb dimensions
- material_region_changed_called = False
- box_dimensions_path = "Axis Aligned Box Shape|Box Configuration|Dimensions"
- editor.EditorComponentAPIBus(bus.Broadcast, "SetComponentProperty", aabb_component_id, box_dimensions_path, math.Vector3(1.0, 1.0, 1.0))
- # Check we don't receive a callback. The macro material component should be inactive as it has no images assigned.
- general.idle_wait_frames(1)
- Report.result(MacroMaterialTests.material_changed_not_called_when_inactive, material_region_changed_called == False)
- # Find the macro material component.
- macro_material_id_type = azlmbr.editor.EditorComponentAPIBus(azlmbr.bus.Broadcast, 'FindComponentTypeIdsByEntityType', ["Terrain Macro Material"], 0)[0]
- macro_material_component_id = azlmbr.editor.EditorComponentAPIBus(azlmbr.bus.Broadcast, 'GetComponentOfType', macro_material_entity.id, macro_material_id_type).GetValue()
- # Find a color image asset.
- color_image_path = os.path.join("assets", "textures", "image.png.streamingimage")
- color_image_asset = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", color_image_path, math.Uuid(), False)
-
- # Assign the image to the MacroMaterial component, which should result in a created message.
- material_created_called = False
- color_texture_path = "Configuration|Color Texture"
- editor.EditorComponentAPIBus(bus.Broadcast, "SetComponentProperty", macro_material_component_id, color_texture_path, color_image_asset)
- call_result = helper.wait_for_condition(lambda: material_created_called == True, 2.0)
- Report.result(MacroMaterialTests.material_created, call_result)
- # Find a normal image asset.
- normal_image_path = os.path.join("assets", "textures", "normal.png.streamingimage")
- normal_image_asset = asset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", normal_image_path, math.Uuid(), False)
- # Assign the normal image to the MacroMaterial component, which should result in a created message.
- material_created_called = False
- material_destroyed_called = False
- normal_texture_path = "Configuration|Normal Texture"
- editor.EditorComponentAPIBus(bus.Broadcast, "SetComponentProperty", macro_material_component_id, normal_texture_path, normal_image_asset)
- # Check the MacroMaterial was destroyed and recreated.
- destroyed_call_result = helper.wait_for_condition(lambda: material_destroyed_called == True, 2.0)
- Report.result(MacroMaterialTests.material_destroyed, destroyed_call_result)
- recreated_call_result = helper.wait_for_condition(lambda: material_created_called == True, 2.0)
- Report.result(MacroMaterialTests.material_recreated, recreated_call_result)
- # Change the aabb dimensions.
- box_dimensions_path = "Axis Aligned Box Shape|Box Configuration|Dimensions"
- editor.EditorComponentAPIBus(bus.Broadcast, "SetComponentProperty", aabb_component_id, box_dimensions_path, math.Vector3(1.0, 1.0, 1.0))
- # Check that a callback is received.
- 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)
- if __name__ == "__main__":
- from editor_python_test_tools.utils import Report
- Report.start_test(TerrainMacroMaterialComponent_MacroMaterialActivates)
|