You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
7.4 KiB
Python
162 lines
7.4 KiB
Python
"""
|
|
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)
|