diff --git a/AutomatedTesting/Gem/PythonTests/Blast/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/Blast/TestSuite_Main.py index a047d09d29..86a3df8271 100644 --- a/AutomatedTesting/Gem/PythonTests/Blast/TestSuite_Main.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/TestSuite_Main.py @@ -17,34 +17,34 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesti from base import TestAutomationBase -@pytest.mark.SUITE_periodic +@pytest.mark.SUITE_main @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) class TestAutomation(TestAutomationBase): def test_ActorSplitsAfterCollision(self, request, workspace, editor, launcher_platform): from .tests import Blast_ActorSplitsAfterCollision as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterRadialDamage(self, request, workspace, editor, launcher_platform): from .tests import Blast_ActorSplitsAfterRadialDamage as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterCapsuleDamage(self, request, workspace, editor, launcher_platform): from .tests import Blast_ActorSplitsAfterCapsuleDamage as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterImpactSpreadDamage(self, request, workspace, editor, launcher_platform): from .tests import Blast_ActorSplitsAfterImpactSpreadDamage as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterShearDamage(self, request, workspace, editor, launcher_platform): from .tests import Blast_ActorSplitsAfterShearDamage as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterTriangleDamage(self, request, workspace, editor, launcher_platform): from .tests import Blast_ActorSplitsAfterTriangleDamage as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterStressDamage(self, request, workspace, editor, launcher_platform): from .tests import Blast_ActorSplitsAfterStressDamage as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentAssetCommands_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentAssetCommands_test_case.py index d661615d02..c694ff2ebb 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentAssetCommands_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentAssetCommands_test_case.py @@ -14,7 +14,7 @@ import azlmbr.math as math import azlmbr.asset as asset # Open a level (any level should work) -editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'WaterSample') +editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'Base') def GetSetCompareTest(component, path, assetId): # Test Get/Set (get old value, set new value, check that new value was set correctly) diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentCommands_test.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentCommands_test.py index 086de87c08..5e5fd31397 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentCommands_test.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentCommands_test.py @@ -24,6 +24,7 @@ from hydra_utils import launch_test_case @pytest.mark.parametrize('level', ['Simple']) class TestComponentCommands(object): + # It needs a new test level in prefab format to make it testable again. def test_MeshComponentBasics(self, request, editor, level, launcher_platform): unexpected_lines=[] diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentCommands_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentCommands_test_case.py index 8723d97fc9..682d804721 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentCommands_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentCommands_test_case.py @@ -5,6 +5,8 @@ For complete copyright and license terms please see the LICENSE at the root of t SPDX-License-Identifier: Apache-2.0 OR MIT """ +# It needs a new test level in prefab format to make it testable again. + # Tests a portion of the Component CRUD Python API while the Editor is running import azlmbr.bus as bus @@ -18,7 +20,7 @@ def CompareComponentEntityIdPairs(component1, component2): return component1.Equal(component2) # Open a level (any level should work) -editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'WaterSample') +editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'Base') # Get Component Types for Mesh and Comment typeIdsList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', ["Mesh", "Comment", "Mesh Collider"], entity.EntityType().Game) diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentPropertyCommands_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentPropertyCommands_test_case.py index face62cf6b..1f692b90ea 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentPropertyCommands_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ComponentPropertyCommands_test_case.py @@ -13,7 +13,7 @@ import azlmbr.entity as entity import azlmbr.math as math # Open a level (any level should work) -editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'WaterSample') +editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'Base') def GetSetCompareTest(component, path, value): oldObj = editor.EditorComponentAPIBus(bus.Broadcast, 'GetComponentProperty', component, path) diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EntityCRUDCommands_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EntityCRUDCommands_test_case.py index 7d72d8893e..490b84791c 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EntityCRUDCommands_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EntityCRUDCommands_test_case.py @@ -12,7 +12,7 @@ import azlmbr.editor as editor from azlmbr.entity import EntityId # Open a level (any level should work) -editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'WaterSample') +editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'Base') parentEntityId = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', EntityId()) childEntityId = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', EntityId()) diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EntityCommands_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EntityCommands_test_case.py index 8aa34a5723..b7827d12e2 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EntityCommands_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EntityCommands_test_case.py @@ -32,7 +32,7 @@ def onEditorEntityDeleted(parameters): # Open a level (any level should work) -editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'WaterSample') +editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'Base') # Listen for notifications when entities are created/deleted handler = bus.NotificationHandler('EditorEntityContextNotificationBus') diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ObjectManagerCommands_test.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ObjectManagerCommands_test.py index b7acfe7e05..1b147d65a9 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ObjectManagerCommands_test.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ObjectManagerCommands_test.py @@ -16,13 +16,13 @@ import os sys.path.append(os.path.dirname(__file__)) from hydra_utils import launch_test_case - @pytest.mark.SUITE_sandbox @pytest.mark.parametrize('launcher_platform', ['windows_editor']) @pytest.mark.parametrize('project', ['AutomatedTesting']) @pytest.mark.parametrize('level', ['Simple']) class TestObjectManagerAutomation(object): + # It needs a new test level in prefab format to make it testable again. def test_ViewPane(self, request, editor, level, launcher_platform): unexpected_lines=[] diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ObjectManagerCommands_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ObjectManagerCommands_test_case.py index 28b49bb4cb..2d2e7a9dda 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ObjectManagerCommands_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ObjectManagerCommands_test_case.py @@ -20,12 +20,10 @@ def fetch_vector3_parts(vec3): general.idle_enable(True) -# Try to open the WaterSample level. If not, fail the test. -# We need to rely on an existing level since the API does not provide -# a way to create entities, but only lets us manipulate them. -editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'WaterSample') +# It needs a new test level in prefab format to make it testable again. +editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'Base') -if (editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'GetCurrentLevelName') == 'WaterSample'): +if (editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'GetCurrentLevelName') == 'Base'): objs_list = general.get_all_objects() diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/PySide_Example_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/PySide_Example_test_case.py index 8ec9dd1fb3..7f111cae9d 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/PySide_Example_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/PySide_Example_test_case.py @@ -21,8 +21,7 @@ import azlmbr.bus as bus import azlmbr.entity as entity import azlmbr.editor as editor import azlmbr.legacy.general as general -import editor_python_test_tools.pyside_component_utils as pysde_component_utils - +import editor_python_test_tools.pyside_component_utils as pyside_component_utils def PySide_Example_test_case(): # Open level, any level should work diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ViewPaneCommands_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ViewPaneCommands_test_case.py index 562e3c733c..64b5417f92 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ViewPaneCommands_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ViewPaneCommands_test_case.py @@ -13,7 +13,7 @@ import azlmbr.math import azlmbr.legacy.general as general # Open a level (any level should work) -editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'WaterSample') +editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'Base') general.idle_wait(0.5) diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ViewportTitleDlgCommands_test_case.py b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ViewportTitleDlgCommands_test_case.py index 1eb0f45a7c..2652df386c 100755 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ViewportTitleDlgCommands_test_case.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/ViewportTitleDlgCommands_test_case.py @@ -11,7 +11,7 @@ import azlmbr.math import azlmbr.legacy.general as general # Open a level (any level should work) -general.open_level_no_prompt('WaterSample') +general.open_level_no_prompt('Base') general.idle_wait(0.5) test_success = True diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py index ac74c611a2..93f1dbb229 100644 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_editor_utils.py @@ -20,7 +20,7 @@ from editor_python_test_tools.utils import TestHelper as helper def open_base_level(): helper.init_idle() - helper.open_level("Prefab", "Base") + helper.open_level("", "Base") def find_entity_by_name(entity_name): diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py index 5580499526..c34361150c 100644 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/hydra_test_utils.py @@ -61,7 +61,7 @@ def launch_and_validate_results(request, test_directory, editor, editor_script, from os import path editor.args.extend([ "--regset=/Amazon/Preferences/EnablePrefabSystem=true", - f"--regset-file={os.path.join(workspace.paths.engine_root(), 'Registry', 'prefab.test.setreg')}"]) + f"--regset-file={os.path.join(editor.workspace.paths.engine_root(), 'Registry', 'prefab.test.setreg')}"]) else: editor.args.extend(["--regset=/Amazon/Preferences/EnablePrefabSystem=false"]) diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_component_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_component_utils.py index 50007374d2..76e75fb20d 100644 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_component_utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/pyside_component_utils.py @@ -7,8 +7,7 @@ SPDX-License-Identifier: Apache-2.0 OR MIT import PySide2 -import editor_python_test_tools.pyside_utils - +import editor_python_test_tools.pyside_utils as pyside_utils def get_component_combobox_values(component_name, property_name, log_fn=None): """ diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py index 35a50b6090..0994e5942a 100644 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/utils.py @@ -67,7 +67,7 @@ class TestHelper: return result == 0 @staticmethod - def open_level(directory : str, level : str): + def open_level(directory : str, level : str, no_prompt: bool = True): # type: (str, str) -> None """ :param level: the name of the level folder in AutomatedTesting\\Physics\\ @@ -75,7 +75,11 @@ class TestHelper: :return: None """ Report.info("Open level {}/{}".format(directory, level)) - success = general.open_level_no_prompt(os.path.join(directory, level)) + if no_prompt: + success = general.open_level_no_prompt(os.path.join(directory, level)) + else: + success = general.open_level(os.path.join(directory, level)) + if not success: open_level_name = general.get_current_level_name() if open_level_name == level: diff --git a/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main.py index 07ae5f6ca0..0cdeaa8a67 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main.py @@ -52,11 +52,11 @@ class TestAutomation(TestAutomationBase): @revert_physics_config def test_CharacterController_SwitchLevels(self, request, workspace, editor, launcher_platform): from .tests.character_controller import CharacterController_SwitchLevels as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Ragdoll_AddPhysxRagdollComponentWorks(self, request, workspace, editor, launcher_platform): from .tests.ragdoll import Ragdoll_AddPhysxRagdollComponentWorks as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_ScriptCanvas_MultipleRaycastNode(self, request, workspace, editor, launcher_platform): @@ -81,7 +81,7 @@ class TestAutomation(TestAutomationBase): @revert_physics_config def test_Collider_PxMeshConvexMeshCollides(self, request, workspace, editor, launcher_platform): from .tests.collider import Collider_PxMeshConvexMeshCollides as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_ShapeCollider_CylinderShapeCollides(self, request, workspace, editor, launcher_platform): diff --git a/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main_Optimized.py index b25b4340e8..a40b9065d6 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main_Optimized.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main_Optimized.py @@ -53,7 +53,8 @@ class EditorSingleTest_WithFileOverrides(EditorSingleTest): for f in original_file_list: fm._restore_file(f, file_list[f]) -@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") + +# @pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") @pytest.mark.SUITE_main @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) @@ -72,6 +73,48 @@ class TestAutomationWithPrefabSystemEnabled(EditorTestSuite): class C4982802_PhysXColliderShape_CanBeSelected(EditorSharedTest): from .tests.collider import Collider_CapsuleShapeEditing as test_module + class C14654881_CharacterController_SwitchLevels(EditorSharedTest): + from .tests.character_controller import CharacterController_SwitchLevels as test_module + + class C14861500_DefaultSetting_ColliderShape(EditorSharedTest): + from .tests.collider import Collider_CheckDefaultShapeSettingIsPxMesh as test_module + + class C4044695_PhysXCollider_AddMultipleSurfaceFbx(EditorSharedTest): + from .tests.collider import Collider_MultipleSurfaceSlots as test_module + + class C14861501_PhysXCollider_RenderMeshAutoAssigned(EditorSharedTest): + from .tests.collider import Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent as test_module + + @pytest.mark.xfail(reason="This will fail due to this issue ATOM-15487.") + class C14861502_PhysXCollider_AssetAutoAssigned(EditorSharedTest): + from .tests.collider import Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent as test_module + + class C4982803_Enable_PxMesh_Option(EditorSharedTest): + from .tests.collider import Collider_PxMeshConvexMeshCollides as test_module + + class C15096740_Material_LibraryUpdatedCorrectly(EditorSharedTest): + from .tests.material import Material_LibraryClearingAssignsDefault as test_module + + class C17411467_AddPhysxRagdollComponent(EditorSharedTest): + from .tests.ragdoll import Ragdoll_AddPhysxRagdollComponentWorks as test_module + + class C19578021_ShapeCollider_CanBeAdded(EditorSharedTest): + from .tests.shape_collider import ShapeCollider_CanBeAddedWitNoWarnings as test_module + + class C19578018_ShapeColliderWithNoShapeComponent(EditorSharedTest): + from .tests.shape_collider import ShapeCollider_InactiveWhenNoShapeComponent as test_module + + class C19723164_ShapeCollider_WontCrashEditor(EditorSharedTest): + from .tests.shape_collider import ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor as test_module + + class C12905528_ForceRegion_WithNonTriggerCollider(EditorSharedTest): + from .tests.force_region import ForceRegion_WithNonTriggerColliderWarning as test_module + # Fixme: expected_lines = ["[Warning] (PhysX Force Region) - Please ensure collider component marked as trigger exists in entity"] + + class C14861504_RenderMeshAsset_WithNoPxAsset(EditorSharedTest): + from .tests.collider import Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx as test_module + + @pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") @pytest.mark.SUITE_main @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @@ -115,19 +158,13 @@ class TestAutomation(EditorTestSuite): class C14654881_CharacterController_SwitchLevels(EditorSharedTest): from .tests.character_controller import CharacterController_SwitchLevels as test_module - - class C17411467_AddPhysxRagdollComponent(EditorSharedTest): - from .tests.ragdoll import Ragdoll_AddPhysxRagdollComponentWorks as test_module - + class C12712453_ScriptCanvas_MultipleRaycastNode(EditorSharedTest): from .tests.script_canvas import ScriptCanvas_MultipleRaycastNode as test_module class C18243586_Joints_HingeLeadFollowerCollide(EditorSharedTest): from .tests.joints import Joints_HingeLeadFollowerCollide as test_module - class C4982803_Enable_PxMesh_Option(EditorSharedTest): - from .tests.collider import Collider_PxMeshConvexMeshCollides as test_module - class C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(EditorSharedTest): from .tests.shape_collider import ShapeCollider_CylinderShapeCollides as test_module @@ -297,19 +334,6 @@ class TestAutomation(EditorTestSuite): class C18243591_Joints_BallLeadFollowerCollide(EditorSharedTest): from .tests.joints import Joints_BallLeadFollowerCollide as test_module - class C19578018_ShapeColliderWithNoShapeComponent(EditorSharedTest): - from .tests.shape_collider import ShapeCollider_InactiveWhenNoShapeComponent as test_module - - class C14861500_DefaultSetting_ColliderShape(EditorSharedTest): - from .tests.collider import Collider_CheckDefaultShapeSettingIsPxMesh as test_module - - class C19723164_ShapeCollider_WontCrashEditor(EditorSharedTest): - from .tests.shape_collider import ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor as test_module - - class C12905528_ForceRegion_WithNonTriggerCollider(EditorSharedTest): - from .tests.force_region import ForceRegion_WithNonTriggerColliderWarning as test_module - # Fixme: expected_lines = ["[Warning] (PhysX Force Region) - Please ensure collider component marked as trigger exists in entity"] - class C5932040_ForceRegion_CubeExertsWorldForce(EditorSharedTest): from .tests.force_region import ForceRegion_WorldSpaceForceOnRigidBodies as test_module @@ -321,26 +345,10 @@ class TestAutomation(EditorTestSuite): class C5959809_ForceRegion_RotationalOffset(EditorSharedTest): from .tests.force_region import ForceRegion_RotationalOffset as test_module - - class C15096740_Material_LibraryUpdatedCorrectly(EditorSharedTest): - from .tests.material import Material_LibraryClearingAssignsDefault as test_module - + class C4976236_AddPhysxColliderComponent(EditorSharedTest): from .tests.collider import Collider_AddColliderComponent as test_module - @pytest.mark.xfail(reason="This will fail due to this issue ATOM-15487.") - class C14861502_PhysXCollider_AssetAutoAssigned(EditorSharedTest): - from .tests.collider import Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent as test_module - - class C14861501_PhysXCollider_RenderMeshAutoAssigned(EditorSharedTest): - from .tests.collider import Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent as test_module - - class C4044695_PhysXCollider_AddMultipleSurfaceFbx(EditorSharedTest): - from .tests.collider import Collider_MultipleSurfaceSlots as test_module - - class C14861504_RenderMeshAsset_WithNoPxAsset(EditorSharedTest): - from .tests.collider import Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx as test_module - class C100000_RigidBody_EnablingGravityWorksPoC(EditorSharedTest): from .tests.rigid_body import RigidBody_EnablingGravityWorksPoC as test_module @@ -350,8 +358,5 @@ class TestAutomation(EditorTestSuite): class C6090547_ForceRegion_ParentChildForceRegions(EditorSharedTest): from .tests.force_region import ForceRegion_ParentChildForcesCombineForces as test_module - class C19578021_ShapeCollider_CanBeAdded(EditorSharedTest): - from .tests.shape_collider import ShapeCollider_CanBeAddedWitNoWarnings as test_module - class C15425929_Undo_Redo(EditorSharedTest): from .tests import Physics_UndoRedoWorksOnEntityWithPhysComponents as test_module diff --git a/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Periodic.py index 6daf852708..d75328d8f7 100755 --- a/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Periodic.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Periodic.py @@ -388,17 +388,17 @@ class TestAutomation(TestAutomationBase): @revert_physics_config def test_ShapeCollider_InactiveWhenNoShapeComponent(self, request, workspace, editor, launcher_platform): from .tests.shape_collider import ShapeCollider_InactiveWhenNoShapeComponent as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_Collider_CheckDefaultShapeSettingIsPxMesh(self, request, workspace, editor, launcher_platform): from .tests.collider import Collider_CheckDefaultShapeSettingIsPxMesh as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor(self, request, workspace, editor, launcher_platform): from .tests.shape_collider import ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_Collider_SphereShapeEditing(self, request, workspace, editor, launcher_platform): @@ -418,7 +418,7 @@ class TestAutomation(TestAutomationBase): def test_ForceRegion_WithNonTriggerColliderWarning(self, request, workspace, editor, launcher_platform): from .tests.force_region import ForceRegion_WithNonTriggerColliderWarning as test_module # Fixme: expected_lines = ["[Warning] (PhysX Force Region) - Please ensure collider component marked as trigger exists in entity"] - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_ForceRegion_WorldSpaceForceOnRigidBodies(self, request, workspace, editor, launcher_platform): from .tests.force_region import ForceRegion_WorldSpaceForceOnRigidBodies as test_module @@ -438,8 +438,12 @@ class TestAutomation(TestAutomationBase): def test_Material_LibraryClearingAssignsDefault(self, request, workspace, editor, launcher_platform): from .tests.material import Material_LibraryClearingAssignsDefault as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) + @pytest.mark.xfail(reason= + "Test failed due to an error message shown while in game mode: " + "'(Prefab) - Invalid asset found referenced in scene while entering game mode. " + "The asset was stored in an instance of Asset.'") def test_Collider_AddColliderComponent(self, request, workspace, editor, launcher_platform): from .tests.collider import Collider_AddColliderComponent as test_module self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) @@ -448,19 +452,19 @@ class TestAutomation(TestAutomationBase): reason="This will fail due to this issue ATOM-15487.") def test_Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent(self, request, workspace, editor, launcher_platform): from .tests.collider import Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent(self, request, workspace, editor, launcher_platform): from .tests.collider import Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Collider_MultipleSurfaceSlots(self, request, workspace, editor, launcher_platform): from .tests.collider import Collider_MultipleSurfaceSlots as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx(self, request, workspace, editor, launcher_platform): from .tests.collider import Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_RigidBody_EnablingGravityWorksPoC(self, request, workspace, editor, launcher_platform): from .tests.rigid_body import RigidBody_EnablingGravityWorksPoC as test_module @@ -486,7 +490,7 @@ class TestAutomation(TestAutomationBase): @revert_physics_config def test_ShapeCollider_CanBeAddedWitNoWarnings(self, request, workspace, editor, launcher_platform): from .tests.shape_collider import ShapeCollider_CanBeAddedWitNoWarnings as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_Physics_UndoRedoWorksOnEntityWithPhysComponents(self, request, workspace, editor, launcher_platform): diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/character_controller/CharacterController_SwitchLevels.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/character_controller/CharacterController_SwitchLevels.py index 564a2a1020..d14daefc7b 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/character_controller/CharacterController_SwitchLevels.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/character_controller/CharacterController_SwitchLevels.py @@ -53,10 +53,12 @@ def CharacterController_SwitchLevels(): import os import sys + from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper import azlmbr.legacy.general as general import azlmbr.bus + import editor_python_test_tools.hydra_editor_utils as hydra # Constants WAIT_FOR_ERRORS = 3.0 @@ -77,7 +79,7 @@ def CharacterController_SwitchLevels(): helper.exit_game_mode(Tests.level1_exit_game_mode) # 2.1) Load level 2 (empty level) - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2.2) Enter game mode helper.enter_game_mode(Tests.level2_enter_game_mode) diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py index cf8bd740c9..4208de9c1d 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py @@ -45,14 +45,15 @@ def Collider_CheckDefaultShapeSettingIsPxMesh(): from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper + import editor_python_test_tools.hydra_editor_utils as hydra + # Open 3D Engine Imports import azlmbr.legacy.general as general PHYSICS_ASSET_INDEX = 7 # Hardcoded enum index value for Shape property - helper.init_idle() # 1) Load empty level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create an entity to hold the PhysX Shape Collider component collider_entity = Entity.create_editor_entity("Collider") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_MultipleSurfaceSlots.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_MultipleSurfaceSlots.py index 2eabc6ab09..832766aa24 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_MultipleSurfaceSlots.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_MultipleSurfaceSlots.py @@ -54,6 +54,8 @@ def Collider_MultipleSurfaceSlots(): from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.asset_utils import Asset + import editor_python_test_tools.hydra_editor_utils as hydra + # Constants PHYSICS_ASSET_INDEX = 7 # Hardcoded enum index value for Shape property SURFACE_TAG_COUNT = 4 # Number of surface tags included in used asset @@ -62,9 +64,8 @@ def Collider_MultipleSurfaceSlots(): STATIC_MESH = os.path.join("assets", "Physics", "Collider_MultipleSurfaceSlots", "test.azmodel") PHYSX_MESH = os.path.join("assets", "Physics","Collider_MultipleSurfaceSlots", "test.pxmesh") - helper.init_idle() # 1) Load the empty level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create an entity test_entity = Entity.create_editor_entity("test_entity") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py index f229842d2f..a73c69c788 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py @@ -54,15 +54,16 @@ def Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent(): from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.asset_utils import Asset + import editor_python_test_tools.hydra_editor_utils as hydra + # Asset paths STATIC_MESH = os.path.join("assets", "Physics", "Collider_PxMeshAutoAssigned", "spherebot", "r0-b_body.azmodel") PHYSX_MESH = os.path.join( "assets", "Physics", "Collider_PxMeshAutoAssigned", "spherebot", "r0-b_body.pxmesh" ) - helper.init_idle() # 1) Load the empty level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create an entity test_entity = Entity.create_editor_entity("test_entity") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py index 8b08aae49d..b42ee69b80 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py @@ -53,6 +53,8 @@ def Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent(): from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.asset_utils import Asset + import editor_python_test_tools.hydra_editor_utils as hydra + # Open 3D Engine Imports import azlmbr.legacy.general as general @@ -60,9 +62,8 @@ def Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent(): MESH_PROPERTY_PATH = "Controller|Configuration|Mesh Asset" TESTED_PROPERTY_PATH = "Shape Configuration|Asset|PhysX Mesh" - helper.init_idle() # 1) Load the empty level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create an entity test_entity = Entity.create_editor_entity("test_entity") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshConvexMeshCollides.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshConvexMeshCollides.py index 7d8f421d6b..36a79953d6 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshConvexMeshCollides.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshConvexMeshCollides.py @@ -62,7 +62,9 @@ def Collider_PxMeshConvexMeshCollides(): from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.asset_utils import Asset + import azlmbr.math as math + import editor_python_test_tools.hydra_editor_utils as hydra # Open 3D Engine Imports import azlmbr @@ -73,9 +75,8 @@ def Collider_PxMeshConvexMeshCollides(): MESH_ASSET_PATH = os.path.join("assets", "Physics", "Collider_PxMeshConvexMeshCollides", "spherebot", "r0-b_body.pxmesh") TIMEOUT = 2.0 - helper.init_idle() # 1) Load the level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create test entity collider = EditorEntity.create_editor_entity_at([512.0, 512.0, 33.0], "Collider") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py index 780c5439dd..bd0ef91903 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py @@ -59,15 +59,16 @@ def Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx(): from editor_python_test_tools.utils import Tracer from editor_python_test_tools.asset_utils import Asset + import editor_python_test_tools.hydra_editor_utils as hydra + # Open 3D Engine Imports import azlmbr.asset as azasset # Asset paths STATIC_MESH = os.path.join("assets", "Physics", "Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx", "test_asset.azmodel") - helper.init_idle() # 1) Load the empty level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create an entity test_entity = Entity.create_editor_entity("test_entity") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py index 2814fe01f8..11e2b2ae63 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py @@ -44,15 +44,15 @@ def ForceRegion_WithNonTriggerColliderWarning(): :return: None """ import azlmbr.legacy.general as general + 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.utils import Report - from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer - helper.init_idle() # 1) Load the empty level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create test entity test_entity = EditorEntity.create_editor_entity("TestEntity") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryClearingAssignsDefault.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryClearingAssignsDefault.py index 66bca8bfda..df991c5b5a 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryClearingAssignsDefault.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryClearingAssignsDefault.py @@ -57,6 +57,8 @@ def Material_LibraryClearingAssignsDefault(): from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.asset_utils import Asset + import editor_python_test_tools.hydra_editor_utils as hydra + # Open 3D Engine Imports import azlmbr.asset as azasset @@ -66,9 +68,8 @@ def Material_LibraryClearingAssignsDefault(): default_material_path = os.path.join("assets", "physics", "surfacetypemateriallibrary.physmaterial") new_material_path = os.path.join("physicssurfaces", "default_phys_materials.physmaterial") - helper.init_idle() # 1) Load the level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create new Entity with PhysX Character Controller test_entity = EditorEntity.create_editor_entity("TestEntity") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py index 9791d385fc..d8cd59e225 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py @@ -49,9 +49,10 @@ def Ragdoll_AddPhysxRagdollComponentWorks(): from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer - helper.init_idle() + import editor_python_test_tools.hydra_editor_utils as hydra + # 1) Load the level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create test entity test_entity = EditorEntity.create_editor_entity("TestEntity") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py index 8c581e105c..e6f57b48d8 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py @@ -50,12 +50,13 @@ def ShapeCollider_CanBeAddedWitNoWarnings(): from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer + import editor_python_test_tools.hydra_editor_utils as hydra + # Open 3D Engine Imports import azlmbr.legacy.general as general - helper.init_idle() # 1) Load the empty level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create an entity collider_entity = Entity.create_editor_entity("Collider") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py index d057e83398..3802b40ba6 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py @@ -54,6 +54,8 @@ def ShapeCollider_InactiveWhenNoShapeComponent(): from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.utils import TestHelper as helper + import editor_python_test_tools.hydra_editor_utils as hydra + # Open 3D Engine Imports import azlmbr.bus as bus import azlmbr.editor as editor @@ -65,9 +67,8 @@ def ShapeCollider_InactiveWhenNoShapeComponent(): """ return editor.EditorComponentAPIBus(bus.Broadcast, "IsComponentEnabled", component_id) - helper.init_idle() # 1) Load the level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Add an entity with a PhysX Shape Collider component. collider = EditorEntity.create_editor_entity("Collider") diff --git a/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py index ba8b598987..e6bf7f88c7 100644 --- a/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py +++ b/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py @@ -45,6 +45,8 @@ def ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor(): from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity + import editor_python_test_tools.hydra_editor_utils as hydra + # Open 3D Engine Imports import azlmbr.legacy.general as general @@ -61,9 +63,8 @@ def ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor(): # Wait 60 frames more general.idle_wait_frames(60) - helper.init_idle() # 1) Load the empty level - helper.open_level("Physics", "Base") + hydra.open_base_level() # 2) Create 512 entities with PhysX Shape Collider and Sphere Shape components entity_failure = False diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/TestSuite_Main.py index 2fc717e256..fa6c81c98a 100644 --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/TestSuite_Main.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/TestSuite_Main.py @@ -24,12 +24,12 @@ from base import TestAutomationBase class TestAutomation(TestAutomationBase): def test_WhiteBox_AddComponentToEntity(self, request, workspace, editor, launcher_platform): from .tests import WhiteBox_AddComponentToEntity as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_WhiteBox_SetDefaultShape(self, request, workspace, editor, launcher_platform): from .tests import WhiteBox_SetDefaultShape as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_WhiteBox_SetInvisible(self, request, workspace, editor, launcher_platform): from .tests import WhiteBox_SetInvisible as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_AddComponentToEntity.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_AddComponentToEntity.py index 7e250e304f..b93a845a25 100644 --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_AddComponentToEntity.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_AddComponentToEntity.py @@ -32,7 +32,7 @@ def C28798177_WhiteBox_AddComponentToEntity(): # open level helper.init_idle() - general.open_level("EmptyLevel") + helper.open_level("WhiteBox", "EmptyLevel", no_prompt=False) # create white box entity and attach component white_box_entity = init.create_white_box_entity() diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetDefaultShape.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetDefaultShape.py index 417561a3bd..c44929e5f2 100644 --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetDefaultShape.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetDefaultShape.py @@ -54,7 +54,7 @@ def C29279329_WhiteBox_SetDefaultShape(): # open level helper.init_idle() - general.open_level("EmptyLevel") + helper.open_level("WhiteBox", "EmptyLevel", no_prompt=False) # create white box entity and attach component white_box_entity = init.create_white_box_entity() diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetInvisible.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetInvisible.py index 9642835e8f..3dd6ed2fc4 100644 --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetInvisible.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetInvisible.py @@ -39,7 +39,7 @@ def C28798205_WhiteBox_SetInvisible(): # open level helper.init_idle() - general.open_level("EmptyLevel") + helper.open_level("WhiteBox", "EmptyLevel", no_prompt=False) white_box_entity_name = 'WhiteBox-Visibility' white_box_visibility_path = 'White Box Material|Visible' diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/bundler_batch_setup_fixture.py b/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/bundler_batch_setup_fixture.py index 9281d5947e..069b333346 100755 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/bundler_batch_setup_fixture.py +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/ap_fixtures/bundler_batch_setup_fixture.py @@ -79,7 +79,7 @@ def bundler_batch_setup_fixture(request, workspace, asset_processor, timeout) -> workspace.asset_processor_platform) ) # Useful sizes - self.max_bundle_size_in_mib = 5 + self.max_bundle_size_in_mib = 35 self.number_of_bytes_in_mib = 1024 * 1024 self.workspace = workspace self.platforms = platforms @@ -271,11 +271,13 @@ def bundler_batch_setup_fixture(request, workspace, asset_processor, timeout) -> for rel_path in self.get_asset_relative_paths(self.asset_info_file_result): assets_from_file.append(os.path.normpath(rel_path)) + expected_size = self.max_bundle_size_in_mib * self.number_of_bytes_in_mib # extract all files from the bundles for bundle in dependent_bundle_name: file_info = os.stat(bundle) # Verify that the size of all bundles is less than the max size specified - assert file_info.st_size <= (self.max_bundle_size_in_mib * self.number_of_bytes_in_mib) + assert file_info.st_size <= expected_size, \ + f"file_info.st_size {file_info.st_size} for bundle {bundle} was expected to be smaller than {expected_size}" with zipfile.ZipFile(bundle) as bundle_zip: bundle_zip.extractall(extract_dir) diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/Motion/SceneDebug/Jack_Idle_Aim_ZUp.dbgsg b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/Motion/SceneDebug/Jack_Idle_Aim_ZUp.dbgsg index c8c5c8697b..d27055e826 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/Motion/SceneDebug/Jack_Idle_Aim_ZUp.dbgsg +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/Motion/SceneDebug/Jack_Idle_Aim_ZUp.dbgsg @@ -242,7 +242,7 @@ Node Type: BoneData BasisX: < 1.000000, -0.000000, 0.000000> BasisY: < 0.000000, 1.000000, 0.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 Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.animation @@ -544,7 +544,7 @@ Node Type: BoneData Node Name: animation Node Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.l_shldr.l_upArm.l_upArmRoll.animation Node Type: AnimationData - KeyFrames: Count 195. Hash: 8781707605519483934 + KeyFrames: Count 195. Hash: 15529789169672670472 TimeStepBetweenFrames: 0.033333 Node Name: transform @@ -710,7 +710,7 @@ Node Type: BoneData BasisX: < 0.514369, 0.855813, 0.054857> BasisY: < 0.088153, 0.010863, -0.996047> 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 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> BasisY: < 0.465563, -0.180309, -0.866452> 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 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> BasisY: < 0.928150, 0.286271, -0.237880> 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 Path: RootNode.jack_root.Bip01__pelvis.spine1.spine2.spine3.r_shldr.r_upArm.r_loArm.r_hand.r_mid1.animation diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/Motion/SceneDebug/jack_idle_aim_zup.dbgsg.xml b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/Motion/SceneDebug/jack_idle_aim_zup.dbgsg.xml index caaf3810fe..ba0da98440 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/Motion/SceneDebug/jack_idle_aim_zup.dbgsg.xml +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/Motion/SceneDebug/jack_idle_aim_zup.dbgsg.xml @@ -114,7 +114,7 @@ - + @@ -191,7 +191,7 @@ - + @@ -204,7 +204,7 @@ - + @@ -268,7 +268,7 @@ - + @@ -319,7 +319,7 @@ - + @@ -408,7 +408,7 @@ - + @@ -497,7 +497,7 @@ - + @@ -548,7 +548,7 @@ - + @@ -650,7 +650,7 @@ - + @@ -701,7 +701,7 @@ - + @@ -727,7 +727,7 @@ - + @@ -854,7 +854,7 @@ - + @@ -905,7 +905,7 @@ - + @@ -1109,7 +1109,7 @@ - + @@ -1141,7 +1141,7 @@ - + @@ -1415,7 +1415,7 @@ - + @@ -1441,7 +1441,7 @@ - + @@ -1454,7 +1454,7 @@ - + @@ -1467,7 +1467,7 @@ - + @@ -1569,7 +1569,7 @@ - + @@ -1582,7 +1582,7 @@ - + @@ -1608,7 +1608,7 @@ - + @@ -1659,7 +1659,7 @@ - + @@ -1710,7 +1710,7 @@ - + @@ -1761,7 +1761,7 @@ - + @@ -1812,7 +1812,7 @@ - + @@ -1825,7 +1825,7 @@ - + @@ -1914,7 +1914,7 @@ - + @@ -1965,7 +1965,7 @@ - + @@ -2067,7 +2067,7 @@ - + @@ -2169,7 +2169,7 @@ - + @@ -2220,7 +2220,7 @@ - + @@ -2271,7 +2271,7 @@ - + @@ -2322,7 +2322,7 @@ - + @@ -2373,7 +2373,7 @@ - + @@ -2475,7 +2475,7 @@ - + @@ -2526,7 +2526,7 @@ - + @@ -2628,7 +2628,7 @@ - + @@ -2793,7 +2793,7 @@ - + @@ -2844,7 +2844,7 @@ - + @@ -3009,7 +3009,7 @@ - + diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingLOD/SceneDebug/lodtest.dbgsg b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingLOD/SceneDebug/lodtest.dbgsg index 90bcb94795..6d0b8fe246 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingLOD/SceneDebug/lodtest.dbgsg +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingLOD/SceneDebug/lodtest.dbgsg @@ -90,7 +90,7 @@ Node Path: RootNode.lodtest_lod1.lodtest_lod1_1 Node Type: MeshData Positions: Count 192. Hash: 1283526254311745349 Normals: Count 192. Hash: 1873340970602844856 - FaceList: Count 124. Hash: 3728991722746136013 + FaceList: Count 124. Hash: 8546457964849634958 FaceMaterialIds: Count 124. Hash: 2372486708814455910 Node Name: lodtest_lod1_2 @@ -107,7 +107,7 @@ Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized Node Type: MeshData Positions: Count 192. Hash: 7921557352486854444 Normals: Count 192. Hash: 1873340970602844856 - FaceList: Count 124. Hash: 18311637590974204568 + FaceList: Count 124. Hash: 7602933716150163115 FaceMaterialIds: Count 124. Hash: 2372486708814455910 Node Name: transform @@ -641,14 +641,14 @@ Node Type: MaterialData Node Name: TangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 192. Hash: 11165448242141781141 + Tangents: Count 192. Hash: 13347865366302598201 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 192. Hash: 7987814487334449536 + Bitangents: Count 192. Hash: 11177881960262055002 GenerationMethod: 1 Node Name: transform @@ -705,14 +705,14 @@ Node Type: MeshVertexUVData Node Name: TangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 192. Hash: 7293001660047850407 + Tangents: Count 192. Hash: 13256424469303674766 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.lodtest_lod1.lodtest_lod1_1_optimized.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 192. Hash: 2874689498270494796 + Bitangents: Count 192. Hash: 12542581737782433115 GenerationMethod: 1 Node Name: transform diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingLOD/SceneDebug/lodtest.dbgsg.xml b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingLOD/SceneDebug/lodtest.dbgsg.xml index d1af4198b5..73cb0e2776 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingLOD/SceneDebug/lodtest.dbgsg.xml +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingLOD/SceneDebug/lodtest.dbgsg.xml @@ -424,7 +424,7 @@ - + @@ -492,7 +492,7 @@ - + @@ -1729,7 +1729,7 @@ - + @@ -1760,7 +1760,7 @@ - + @@ -1891,7 +1891,7 @@ - + @@ -1922,7 +1922,7 @@ - + diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingPhysics/SceneDebug/physicstest.dbgsg b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingPhysics/SceneDebug/physicstest.dbgsg index 9b7ec58b7a..8cafe03a8f 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingPhysics/SceneDebug/physicstest.dbgsg +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingPhysics/SceneDebug/physicstest.dbgsg @@ -15,7 +15,7 @@ Node Path: RootNode.Cone.Cone_1 Node Type: MeshData Positions: Count 128. Hash: 7714223793259938211 Normals: Count 128. Hash: 2352668179264002707 - FaceList: Count 62. Hash: 14563017593520122982 + FaceList: Count 62. Hash: 9996709738915796379 FaceMaterialIds: Count 62. Hash: 12234218120113875284 Node Name: Cone_2 @@ -32,7 +32,7 @@ Node Path: RootNode.Cone.Cone_1_optimized Node Type: MeshData Positions: Count 128. Hash: 10174710861731544050 Normals: Count 128. Hash: 2352668179264002707 - FaceList: Count 62. Hash: 11332459830831720586 + FaceList: Count 62. Hash: 16809217014760075539 FaceMaterialIds: Count 62. Hash: 12234218120113875284 Node Name: Cube_phys_1 @@ -100,14 +100,14 @@ Node Type: MaterialData Node Name: TangentSet_0 Node Path: RootNode.Cone.Cone_1.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 128. Hash: 14351734474754285313 + Tangents: Count 128. Hash: 913385441694195840 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.Cone.Cone_1.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 128. Hash: 15997251922861304891 + Bitangents: Count 128. Hash: 16763868708150748964 GenerationMethod: 1 Node Name: transform @@ -164,14 +164,14 @@ Node Type: MeshVertexUVData Node Name: TangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 128. Hash: 12937806066914201637 + Tangents: Count 128. Hash: 11496565252852403390 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 128. Hash: 873786942732834087 + Bitangents: Count 128. Hash: 6810649909977646014 GenerationMethod: 1 Node Name: transform diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingPhysics/SceneDebug/physicstest.dbgsg.xml b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingPhysics/SceneDebug/physicstest.dbgsg.xml index b22eb14fc6..24452dabeb 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingPhysics/SceneDebug/physicstest.dbgsg.xml +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/SoftNamingPhysics/SceneDebug/physicstest.dbgsg.xml @@ -55,7 +55,7 @@ - + @@ -123,7 +123,7 @@ - + @@ -309,7 +309,7 @@ - + @@ -340,7 +340,7 @@ - + @@ -471,7 +471,7 @@ - + @@ -502,7 +502,7 @@ - + diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshLinkedMaterials/SceneDebug/multiple_mesh_linked_materials.dbgsg b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshLinkedMaterials/SceneDebug/multiple_mesh_linked_materials.dbgsg index c0544ea3a9..a9f329af3b 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshLinkedMaterials/SceneDebug/multiple_mesh_linked_materials.dbgsg +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshLinkedMaterials/SceneDebug/multiple_mesh_linked_materials.dbgsg @@ -40,7 +40,7 @@ Node Path: RootNode.Cone.Cone_1 Node Type: MeshData Positions: Count 128. Hash: 12506421592104186200 Normals: Count 128. Hash: 367461522682321485 - FaceList: Count 62. Hash: 13208951979626973193 + FaceList: Count 62. Hash: 5910399941817424750 FaceMaterialIds: Count 62. Hash: 15454348664434923102 Node Name: Cone_2 @@ -57,7 +57,7 @@ Node Path: RootNode.Cone.Cone_1_optimized Node Type: MeshData Positions: Count 128. Hash: 14946490408303214595 Normals: Count 128. Hash: 367461522682321485 - FaceList: Count 62. Hash: 11102693598481718079 + FaceList: Count 62. Hash: 17210030509394354449 FaceMaterialIds: Count 62. Hash: 15454348664434923102 Node Name: transform @@ -389,14 +389,14 @@ Node Type: MaterialData Node Name: TangentSet_0 Node Path: RootNode.Cone.Cone_1.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 128. Hash: 12695232913942738512 + Tangents: Count 128. Hash: 11574815809363656385 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.Cone.Cone_1.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 128. Hash: 9034210764777745751 + Bitangents: Count 128. Hash: 1026129762512670051 GenerationMethod: 1 Node Name: transform @@ -483,14 +483,14 @@ Node Type: MeshVertexUVData Node Name: TangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 128. Hash: 10740776669168782230 + Tangents: Count 128. Hash: 5198081677141836233 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.Cone.Cone_1_optimized.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 128. Hash: 6990068477421150065 + Bitangents: Count 128. Hash: 6948605204859680167 GenerationMethod: 1 Node Name: transform diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshLinkedMaterials/SceneDebug/multiple_mesh_linked_materials.dbgsg.xml b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshLinkedMaterials/SceneDebug/multiple_mesh_linked_materials.dbgsg.xml index 3eaf018fb6..fe2ffe18f5 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshLinkedMaterials/SceneDebug/multiple_mesh_linked_materials.dbgsg.xml +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshLinkedMaterials/SceneDebug/multiple_mesh_linked_materials.dbgsg.xml @@ -178,7 +178,7 @@ - + @@ -246,7 +246,7 @@ - + @@ -957,7 +957,7 @@ - + @@ -988,7 +988,7 @@ - + @@ -1174,7 +1174,7 @@ - + @@ -1205,7 +1205,7 @@ - + diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshOneMaterial/SceneDebug/multiple_mesh_one_material.dbgsg b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshOneMaterial/SceneDebug/multiple_mesh_one_material.dbgsg index 48135760f2..f1b230c37f 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshOneMaterial/SceneDebug/multiple_mesh_one_material.dbgsg +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshOneMaterial/SceneDebug/multiple_mesh_one_material.dbgsg @@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1 Node Type: MeshData Positions: Count 192. Hash: 1283526254311745349 Normals: Count 192. Hash: 1873340970602844856 - FaceList: Count 124. Hash: 3728991722746136013 + FaceList: Count 124. Hash: 8546457964849634958 FaceMaterialIds: Count 124. Hash: 2372486708814455910 Node Name: Cylinder_2 @@ -57,7 +57,7 @@ Node Path: RootNode.Cylinder.Cylinder_1_optimized Node Type: MeshData Positions: Count 192. Hash: 7921557352486854444 Normals: Count 192. Hash: 1873340970602844856 - FaceList: Count 124. Hash: 18311637590974204568 + FaceList: Count 124. Hash: 7602933716150163115 FaceMaterialIds: Count 124. Hash: 2372486708814455910 Node Name: transform @@ -269,14 +269,14 @@ Node Type: MaterialData Node Name: TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 192. Hash: 11165448242141781141 + Tangents: Count 192. Hash: 13347865366302598201 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 192. Hash: 7987814487334449536 + Bitangents: Count 192. Hash: 11177881960262055002 GenerationMethod: 1 Node Name: transform @@ -333,14 +333,14 @@ Node Type: MeshVertexUVData Node Name: TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 192. Hash: 7293001660047850407 + Tangents: Count 192. Hash: 13256424469303674766 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 192. Hash: 2874689498270494796 + Bitangents: Count 192. Hash: 12542581737782433115 GenerationMethod: 1 Node Name: transform diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshOneMaterial/SceneDebug/multiple_mesh_one_material.dbgsg.xml b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshOneMaterial/SceneDebug/multiple_mesh_one_material.dbgsg.xml index 39ac33f654..2ff1a1bc9e 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshOneMaterial/SceneDebug/multiple_mesh_one_material.dbgsg.xml +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshOneMaterial/SceneDebug/multiple_mesh_one_material.dbgsg.xml @@ -178,7 +178,7 @@ - + @@ -246,7 +246,7 @@ - + @@ -737,7 +737,7 @@ - + @@ -768,7 +768,7 @@ - + @@ -899,7 +899,7 @@ - + @@ -930,7 +930,7 @@ - + diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material.dbgsg b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material.dbgsg index c5587a2778..8a350f1ff9 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material.dbgsg +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material.dbgsg @@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1 Node Type: MeshData Positions: Count 192. Hash: 1283526254311745349 Normals: Count 192. Hash: 1873340970602844856 - FaceList: Count 124. Hash: 3728991722746136013 + FaceList: Count 124. Hash: 8546457964849634958 FaceMaterialIds: Count 124. Hash: 2372486708814455910 Node Name: Cylinder_2 @@ -57,7 +57,7 @@ Node Path: RootNode.Cylinder.Cylinder_1_optimized Node Type: MeshData Positions: Count 192. Hash: 7921557352486854444 Normals: Count 192. Hash: 1873340970602844856 - FaceList: Count 124. Hash: 18311637590974204568 + FaceList: Count 124. Hash: 7602933716150163115 FaceMaterialIds: Count 124. Hash: 2372486708814455910 Node Name: transform @@ -269,14 +269,14 @@ Node Type: MaterialData Node Name: TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 192. Hash: 11165448242141781141 + Tangents: Count 192. Hash: 13347865366302598201 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 192. Hash: 7987814487334449536 + Bitangents: Count 192. Hash: 11177881960262055002 GenerationMethod: 1 Node Name: transform @@ -333,14 +333,14 @@ Node Type: MeshVertexUVData Node Name: TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 192. Hash: 7293001660047850407 + Tangents: Count 192. Hash: 13256424469303674766 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1_optimized.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 192. Hash: 2874689498270494796 + Bitangents: Count 192. Hash: 12542581737782433115 GenerationMethod: 1 Node Name: transform diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material.dbgsg.xml b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material.dbgsg.xml index c41c1414a4..5d86d401cf 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material.dbgsg.xml +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material.dbgsg.xml @@ -178,7 +178,7 @@ - + @@ -246,7 +246,7 @@ - + @@ -737,7 +737,7 @@ - + @@ -768,7 +768,7 @@ - + @@ -899,7 +899,7 @@ - + @@ -930,7 +930,7 @@ - + diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material_override.dbgsg b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material_override.dbgsg index 8426a68d3b..32fbc37a50 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material_override.dbgsg +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material_override.dbgsg @@ -40,7 +40,7 @@ Node Path: RootNode.Cylinder.Cylinder_1 Node Type: MeshData Positions: Count 192. Hash: 1283526254311745349 Normals: Count 192. Hash: 1873340970602844856 - FaceList: Count 124. Hash: 3728991722746136013 + FaceList: Count 124. Hash: 8546457964849634958 FaceMaterialIds: Count 124. Hash: 2372486708814455910 Node Name: Cylinder_2 @@ -261,14 +261,14 @@ Node Type: MaterialData Node Name: TangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.TangentSet_0 Node Type: MeshVertexTangentData - Tangents: Count 192. Hash: 11165448242141781141 + Tangents: Count 192. Hash: 13347865366302598201 GenerationMethod: 1 SetIndex: 0 Node Name: BitangentSet_0 Node Path: RootNode.Cylinder.Cylinder_1.BitangentSet_0 Node Type: MeshVertexBitangentData - Bitangents: Count 192. Hash: 7987814487334449536 + Bitangents: Count 192. Hash: 11177881960262055002 GenerationMethod: 1 Node Name: transform diff --git a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material_override.dbgsg.xml b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material_override.dbgsg.xml index 01167ec0ee..dec8ec1bb8 100644 --- a/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material_override.dbgsg.xml +++ b/AutomatedTesting/Gem/PythonTests/assetpipeline/fbx_tests/assets/TwoMeshTwoMaterial/SceneDebug/multiple_mesh_multiple_material_override.dbgsg.xml @@ -178,7 +178,7 @@ - + @@ -682,7 +682,7 @@ - + @@ -713,7 +713,7 @@ - + diff --git a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py index 27af63ddbc..887bfe2426 100755 --- a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py +++ b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py @@ -27,15 +27,15 @@ TEST_DIRECTORY = os.path.dirname(__file__) class TestAutomation(TestAutomationBase): def test_Pane_HappyPath_OpenCloseSuccessfully(self, request, workspace, editor, launcher_platform): from . import Pane_HappyPath_OpenCloseSuccessfully as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Pane_HappyPath_DocksProperly(self, request, workspace, editor, launcher_platform): from . import Pane_HappyPath_DocksProperly as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Pane_HappyPath_ResizesProperly(self, request, workspace, editor, launcher_platform): from . import Pane_HappyPath_ResizesProperly as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) @@ -45,7 +45,7 @@ class TestAutomation(TestAutomationBase): request.addfinalizer(teardown) file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True) from . import ScriptCanvas_TwoComponents_InteractSuccessfully as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) @@ -55,15 +55,15 @@ class TestAutomation(TestAutomationBase): request.addfinalizer(teardown) file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True) from . import ScriptCanvas_ChangingAssets_ComponentStable as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Graph_HappyPath_ZoomInZoomOut(self, request, workspace, editor, launcher_platform): from . import Graph_HappyPath_ZoomInZoomOut as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_NodePalette_HappyPath_CanSelectNode(self, request, workspace, editor, launcher_platform): from . import NodePalette_HappyPath_CanSelectNode as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) @@ -73,11 +73,11 @@ class TestAutomation(TestAutomationBase): request.addfinalizer(teardown) file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True) from . import ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_NodePalette_HappyPath_ClearSelection(self, request, workspace, editor, launcher_platform, project): from . import NodePalette_HappyPath_ClearSelection as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) @@ -87,7 +87,7 @@ class TestAutomation(TestAutomationBase): request.addfinalizer(teardown) file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True) from . import ScriptCanvas_TwoEntities_UseSimultaneously as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_ScriptEvent_HappyPath_CreatedWithoutError(self, request, workspace, editor, launcher_platform, project): def teardown(): @@ -99,19 +99,19 @@ class TestAutomation(TestAutomationBase): [os.path.join(workspace.paths.project(), "ScriptCanvas", "test_file.scriptevent")], True, True ) from . import ScriptEvent_HappyPath_CreatedWithoutError as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_ScriptCanvasTools_Toggle_OpenCloseSuccess(self, request, workspace, editor, launcher_platform): from . import ScriptCanvasTools_Toggle_OpenCloseSuccess as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_NodeInspector_HappyPath_VariableRenames(self, request, workspace, editor, launcher_platform, project): from . import NodeInspector_HappyPath_VariableRenames as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Debugger_HappyPath_TargetMultipleGraphs(self, request, workspace, editor, launcher_platform, project): from . import Debugger_HappyPath_TargetMultipleGraphs as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.parametrize("level", ["tmp_level"]) def test_Debugger_HappyPath_TargetMultipleEntities(self, request, workspace, editor, launcher_platform, project, level): @@ -120,16 +120,16 @@ class TestAutomation(TestAutomationBase): request.addfinalizer(teardown) file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True) from . import Debugger_HappyPath_TargetMultipleEntities as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") def test_EditMenu_Default_UndoRedo(self, request, workspace, editor, launcher_platform, project): from . import EditMenu_Default_UndoRedo as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Pane_Undocked_ClosesSuccessfully(self, request, workspace, editor, launcher_platform): from . import Pane_Undocked_ClosesSuccessfully as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.parametrize("level", ["tmp_level"]) def test_Entity_HappyPath_AddScriptCanvasComponent(self, request, workspace, editor, launcher_platform, project, level): @@ -138,11 +138,11 @@ class TestAutomation(TestAutomationBase): request.addfinalizer(teardown) file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True) from . import Entity_HappyPath_AddScriptCanvasComponent as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Pane_Default_RetainOnSCRestart(self, request, workspace, editor, launcher_platform): from . import Pane_Default_RetainOnSCRestart as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) @@ -152,7 +152,7 @@ class TestAutomation(TestAutomationBase): request.addfinalizer(teardown) file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True) from . import ScriptEvents_HappyPath_SendReceiveAcrossMultiple as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) @@ -162,7 +162,7 @@ class TestAutomation(TestAutomationBase): request.addfinalizer(teardown) file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True) from . import ScriptEvents_Default_SendReceiveSuccessfully as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) @@ -172,24 +172,24 @@ class TestAutomation(TestAutomationBase): request.addfinalizer(teardown) file_system.delete([os.path.join(workspace.paths.project(), "Levels", level)], True, True) from . import ScriptEvents_ReturnSetType_Successfully as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_NodeCategory_ExpandOnClick(self, request, workspace, editor, launcher_platform): from . import NodeCategory_ExpandOnClick as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_NodePalette_SearchText_Deletion(self, request, workspace, editor, launcher_platform): from . import NodePalette_SearchText_Deletion as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") def test_VariableManager_UnpinVariableType_Works(self, request, workspace, editor, launcher_platform): from . import VariableManager_UnpinVariableType_Works as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_Node_HappyPath_DuplicateNode(self, request, workspace, editor, launcher_platform): from . import Node_HappyPath_DuplicateNode as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) def test_ScriptEvent_AddRemoveParameter_ActionsSuccessful(self, request, workspace, editor, launcher_platform): def teardown(): @@ -201,7 +201,7 @@ class TestAutomation(TestAutomationBase): [os.path.join(workspace.paths.project(), "ScriptCanvas", "test_file.scriptevent")], True, True ) from . import ScriptEvent_AddRemoveParameter_ActionsSuccessful as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) # NOTE: We had to use hydra_test_utils.py, as TestAutomationBase run_test method # fails because of pyside_utils import @@ -227,7 +227,6 @@ class TestScriptCanvasTests(object): expected_lines, auto_test_mode=False, timeout=60, - enable_prefab_system=False, ) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @@ -246,7 +245,6 @@ class TestScriptCanvasTests(object): expected_lines, auto_test_mode=False, timeout=60, - enable_prefab_system=False, ) def test_GraphClose_Default_SavePrompt(self, request, editor, launcher_platform): @@ -263,7 +261,6 @@ class TestScriptCanvasTests(object): expected_lines, auto_test_mode=False, timeout=60, - enable_prefab_system=False, ) def test_VariableManager_Default_CreateDeleteVars(self, request, editor, launcher_platform): @@ -278,7 +275,6 @@ class TestScriptCanvasTests(object): expected_lines, auto_test_mode=False, timeout=60, - enable_prefab_system=False, ) @pytest.mark.parametrize( @@ -314,7 +310,6 @@ class TestScriptCanvasTests(object): cfg_args=[config.get('cfg_args')], auto_test_mode=False, timeout=60, - enable_prefab_system=False, ) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @@ -343,7 +338,6 @@ class TestScriptCanvasTests(object): expected_lines, auto_test_mode=False, timeout=60, - enable_prefab_system=False, ) @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @@ -371,6 +365,5 @@ class TestScriptCanvasTests(object): expected_lines, auto_test_mode=False, timeout=60, - enable_prefab_system=False, ) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Sandbox.py b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Sandbox.py index 071ae2286c..91b01d8d08 100644 --- a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Sandbox.py +++ b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Sandbox.py @@ -23,4 +23,4 @@ class TestAutomation(TestAutomationBase): def test_Opening_Closing_Pane(self, request, workspace, editor, launcher_platform): from . import Opening_Closing_Pane as test_module - self._run_test(request, workspace, editor, test_module, enable_prefab_system=False) + self._run_test(request, workspace, editor, test_module) diff --git a/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt index 69d411536f..226d1970d8 100644 --- a/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt @@ -45,4 +45,14 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) AutomatedTesting.Assets ) + ly_add_pytest( + NAME AutomatedTesting::SmokeTest_Sandbox + TEST_SUITE sandbox + TEST_SERIAL + PATH ${CMAKE_CURRENT_LIST_DIR} + PYTEST_MARKS "SUITE_sandbox" + RUNTIME_DEPENDENCIES + AZ::AssetProcessor + ) + endif() diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py index 4c716a5be3..161614e1fe 100644 --- a/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py +++ b/AutomatedTesting/Gem/PythonTests/smoke/test_CLITool_AssetBuilder_Works.py @@ -14,7 +14,7 @@ import pytest import subprocess -@pytest.mark.SUITE_smoke +@pytest.mark.SUITE_sandbox class TestCLIToolAssetBuilderWorks(object): def test_CLITool_AssetBuilder_Works(self, build_directory): file_path = os.path.join(build_directory, "AssetBuilder") diff --git a/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterCollision/Blast_ActorSplitsAfterCollision.prefab b/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterCollision/Blast_ActorSplitsAfterCollision.prefab new file mode 100644 index 0000000000..df1a632788 --- /dev/null +++ b/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterCollision/Blast_ActorSplitsAfterCollision.prefab @@ -0,0 +1,255 @@ +{ + "ContainerEntity": { + "Id": "ContainerEntity", + "Name": "Blast_ActorSplitsAfterCollision", + "Components": { + "Component_[10182366347512475253]": { + "$type": "EditorPrefabComponent", + "Id": 10182366347512475253 + }, + "Component_[12917798267488243668]": { + "$type": "EditorPendingCompositionComponent", + "Id": 12917798267488243668 + }, + "Component_[3261249813163778338]": { + "$type": "EditorOnlyEntityComponent", + "Id": 3261249813163778338 + }, + "Component_[3837204912784440039]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 3837204912784440039 + }, + "Component_[4272963378099646759]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 4272963378099646759, + "Parent Entity": "" + }, + "Component_[4848458548047175816]": { + "$type": "EditorVisibilityComponent", + "Id": 4848458548047175816 + }, + "Component_[5787060997243919943]": { + "$type": "EditorInspectorComponent", + "Id": 5787060997243919943 + }, + "Component_[7804170251266531779]": { + "$type": "EditorLockComponent", + "Id": 7804170251266531779 + }, + "Component_[7874177159288365422]": { + "$type": "EditorEntitySortComponent", + "Id": 7874177159288365422 + }, + "Component_[8018146290632383969]": { + "$type": "EditorEntityIconComponent", + "Id": 8018146290632383969 + }, + "Component_[8452360690590857075]": { + "$type": "SelectionComponent", + "Id": 8452360690590857075 + } + } + }, + "Entities": { + "Entity_[678057008134]": { + "Id": "Entity_[678057008134]", + "Name": "Sphere_Moving", + "Components": { + "Component_[158491845118288574]": { + "$type": "EditorColliderComponent", + "Id": 158491845118288574, + "ColliderConfiguration": { + "CollisionGroupId": { + "GroupId": "{45EBDE87-10BA-405B-9118-1FE9C750E5A3}" + }, + "MaterialSelection": { + "MaterialIds": [ + {} + ] + } + }, + "ShapeConfiguration": { + "ShapeType": 0 + } + }, + "Component_[15882836540317052831]": { + "$type": "EditorOnlyEntityComponent", + "Id": 15882836540317052831 + }, + "Component_[15988538924200810686]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 15988538924200810686 + }, + "Component_[17332118306686659923]": { + "$type": "SelectionComponent", + "Id": 17332118306686659923 + }, + "Component_[18013098363541384892]": { + "$type": "EditorPendingCompositionComponent", + "Id": 18013098363541384892 + }, + "Component_[3299242856338866058]": { + "$type": "EditorVisibilityComponent", + "Id": 3299242856338866058 + }, + "Component_[3368757662560547573]": { + "$type": "EditorInspectorComponent", + "Id": 3368757662560547573, + "ComponentOrderEntryArray": [ + { + "ComponentId": 9646670826592538370 + }, + { + "ComponentId": 158491845118288574, + "SortIndex": 1 + }, + { + "ComponentId": 7177752238184232813, + "SortIndex": 2 + }, + { + "ComponentId": 3538399061071907667, + "SortIndex": 3 + } + ] + }, + "Component_[3538399061071907667]": { + "$type": "EditorSphereShapeComponent", + "Id": 3538399061071907667, + "GameView": true + }, + "Component_[3584595476595239676]": { + "$type": "EditorLockComponent", + "Id": 3584595476595239676 + }, + "Component_[4539775501292735153]": { + "$type": "EditorEntityIconComponent", + "Id": 4539775501292735153 + }, + "Component_[5885911623396957736]": { + "$type": "EditorEntitySortComponent", + "Id": 5885911623396957736 + }, + "Component_[7177752238184232813]": { + "$type": "EditorRigidBodyComponent", + "Id": 7177752238184232813, + "Configuration": { + "entityId": "", + "Compute Mass": false, + "Mass": 100.0, + "Inertia tensor": { + "roll": 0.0, + "pitch": 0.0, + "yaw": 0.0, + "scale": 0.10000000149011612 + } + } + }, + "Component_[9646670826592538370]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 9646670826592538370, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 511.9999694824219, + 532.0, + 43.0 + ] + } + } + } + }, + "Entity_[682351975430]": { + "Id": "Entity_[682351975430]", + "Name": "Destructable_Box", + "Components": { + "Component_[14428979635353087750]": { + "$type": "EditorEntitySortComponent", + "Id": 14428979635353087750 + }, + "Component_[14459069801260260996]": { + "$type": "EditorPendingCompositionComponent", + "Id": 14459069801260260996 + }, + "Component_[16353277599917996564]": { + "$type": "SelectionComponent", + "Id": 16353277599917996564 + }, + "Component_[16528484535459302978]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 16528484535459302978 + }, + "Component_[17689177494335411023]": { + "$type": "EditorVisibilityComponent", + "Id": 17689177494335411023 + }, + "Component_[18116908665747450198]": { + "$type": "EditorOnlyEntityComponent", + "Id": 18116908665747450198 + }, + "Component_[3544855145233062627]": { + "$type": "EditorInspectorComponent", + "Id": 3544855145233062627, + "ComponentOrderEntryArray": [ + { + "ComponentId": 3826825320808092990 + }, + { + "ComponentId": 5627868831214978789, + "SortIndex": 1 + }, + { + "ComponentId": 7875098433529363009, + "SortIndex": 2 + } + ] + }, + "Component_[3569626399556956817]": { + "$type": "EditorLockComponent", + "Id": 3569626399556956817 + }, + "Component_[3826825320808092990]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 3826825320808092990, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 511.9991455078125, + 532.031982421875, + 39.52538299560547 + ], + "Scale": [ + 1.0000001192092896, + 0.9999998807907104, + 1.0 + ] + } + }, + "Component_[5627868831214978789]": { + "$type": "EditorBlastFamilyComponent", + "Id": 5627868831214978789, + "BlastAsset": { + "assetId": { + "guid": "{BAB71D97-F136-5C11-8AB6-6E9F768CA83B}" + }, + "assetHint": "assets/destruction/box_2_chunks.blast" + }, + "BlastMaterial": { + "BlastMaterialId": "{2F200947-553F-487F-B4EA-57F0EF5AE024}" + }, + "PhysicsMaterial": { + "MaterialId": "{34AD1046-240B-448C-A694-AE80F595C431}" + } + }, + "Component_[7159608037522336146]": { + "$type": "EditorEntityIconComponent", + "Id": 7159608037522336146 + }, + "Component_[7875098433529363009]": { + "$type": "EditorBlastMeshDataComponent", + "Id": 7875098433529363009 + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterDamage/Blast_ActorSplitsAfterDamage.prefab b/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterDamage/Blast_ActorSplitsAfterDamage.prefab new file mode 100644 index 0000000000..79445eea4e --- /dev/null +++ b/AutomatedTesting/Levels/Blast/Blast_ActorSplitsAfterDamage/Blast_ActorSplitsAfterDamage.prefab @@ -0,0 +1,148 @@ +{ + "ContainerEntity": { + "Id": "ContainerEntity", + "Name": "Blast_ActorSplitsAfterDamage", + "Components": { + "Component_[10182366347512475253]": { + "$type": "EditorPrefabComponent", + "Id": 10182366347512475253 + }, + "Component_[12917798267488243668]": { + "$type": "EditorPendingCompositionComponent", + "Id": 12917798267488243668 + }, + "Component_[3261249813163778338]": { + "$type": "EditorOnlyEntityComponent", + "Id": 3261249813163778338 + }, + "Component_[3837204912784440039]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 3837204912784440039 + }, + "Component_[4272963378099646759]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 4272963378099646759, + "Parent Entity": "" + }, + "Component_[4848458548047175816]": { + "$type": "EditorVisibilityComponent", + "Id": 4848458548047175816 + }, + "Component_[5787060997243919943]": { + "$type": "EditorInspectorComponent", + "Id": 5787060997243919943 + }, + "Component_[7804170251266531779]": { + "$type": "EditorLockComponent", + "Id": 7804170251266531779 + }, + "Component_[7874177159288365422]": { + "$type": "EditorEntitySortComponent", + "Id": 7874177159288365422 + }, + "Component_[8018146290632383969]": { + "$type": "EditorEntityIconComponent", + "Id": 8018146290632383969 + }, + "Component_[8452360690590857075]": { + "$type": "SelectionComponent", + "Id": 8452360690590857075 + } + } + }, + "Entities": { + "Entity_[682351975430]": { + "Id": "Entity_[682351975430]", + "Name": "Destructable_Box", + "Components": { + "Component_[14428979635353087750]": { + "$type": "EditorEntitySortComponent", + "Id": 14428979635353087750 + }, + "Component_[14459069801260260996]": { + "$type": "EditorPendingCompositionComponent", + "Id": 14459069801260260996 + }, + "Component_[16353277599917996564]": { + "$type": "SelectionComponent", + "Id": 16353277599917996564 + }, + "Component_[16528484535459302978]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 16528484535459302978 + }, + "Component_[17689177494335411023]": { + "$type": "EditorVisibilityComponent", + "Id": 17689177494335411023 + }, + "Component_[18116908665747450198]": { + "$type": "EditorOnlyEntityComponent", + "Id": 18116908665747450198 + }, + "Component_[3544855145233062627]": { + "$type": "EditorInspectorComponent", + "Id": 3544855145233062627, + "ComponentOrderEntryArray": [ + { + "ComponentId": 3826825320808092990 + }, + { + "ComponentId": 5627868831214978789, + "SortIndex": 1 + }, + { + "ComponentId": 7875098433529363009, + "SortIndex": 2 + } + ] + }, + "Component_[3569626399556956817]": { + "$type": "EditorLockComponent", + "Id": 3569626399556956817 + }, + "Component_[3826825320808092990]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 3826825320808092990, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 511.9991455078125, + 532.031982421875, + 39.52538299560547 + ], + "Scale": [ + 1.0000001192092896, + 0.9999998807907104, + 1.0 + ] + } + }, + "Component_[5627868831214978789]": { + "$type": "EditorBlastFamilyComponent", + "Id": 5627868831214978789, + "BlastAsset": { + "assetId": { + "guid": "{BAB71D97-F136-5C11-8AB6-6E9F768CA83B}" + }, + "assetHint": "assets/destruction/box_2_chunks.blast" + }, + "BlastMaterial": { + "BlastMaterialId": "{2F200947-553F-487F-B4EA-57F0EF5AE024}" + }, + "PhysicsMaterial": { + "MaterialId": "{34AD1046-240B-448C-A694-AE80F595C431}" + } + }, + "Component_[7159608037522336146]": { + "$type": "EditorEntityIconComponent", + "Id": 7159608037522336146 + }, + "Component_[7875098433529363009]": { + "$type": "EditorBlastMeshDataComponent", + "Id": 7875098433529363009, + "Show Mesh Assets": true + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/CharacterController_SwitchLevels.prefab b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/CharacterController_SwitchLevels.prefab new file mode 100644 index 0000000000..aa0167dfb4 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/CharacterController_SwitchLevels.prefab @@ -0,0 +1,217 @@ +{ + "ContainerEntity": { + "Id": "ContainerEntity", + "Name": "CharacterController_SwitchLevels", + "Components": { + "Component_[10182366347512475253]": { + "$type": "EditorPrefabComponent", + "Id": 10182366347512475253 + }, + "Component_[12917798267488243668]": { + "$type": "EditorPendingCompositionComponent", + "Id": 12917798267488243668 + }, + "Component_[3261249813163778338]": { + "$type": "EditorOnlyEntityComponent", + "Id": 3261249813163778338 + }, + "Component_[3837204912784440039]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 3837204912784440039 + }, + "Component_[4272963378099646759]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 4272963378099646759, + "Parent Entity": "" + }, + "Component_[4848458548047175816]": { + "$type": "EditorVisibilityComponent", + "Id": 4848458548047175816 + }, + "Component_[5787060997243919943]": { + "$type": "EditorInspectorComponent", + "Id": 5787060997243919943 + }, + "Component_[7804170251266531779]": { + "$type": "EditorLockComponent", + "Id": 7804170251266531779 + }, + "Component_[7874177159288365422]": { + "$type": "EditorEntitySortComponent", + "Id": 7874177159288365422 + }, + "Component_[8018146290632383969]": { + "$type": "EditorEntityIconComponent", + "Id": 8018146290632383969 + }, + "Component_[8452360690590857075]": { + "$type": "SelectionComponent", + "Id": 8452360690590857075 + } + } + }, + "Entities": { + "Entity_[271494215500]": { + "Id": "Entity_[271494215500]", + "Name": "DefaultLevelSetup", + "Components": { + "Component_[10017568850356726118]": { + "$type": "EditorEntitySortComponent", + "Id": 10017568850356726118 + }, + "Component_[13730791873699866292]": { + "$type": "EditorVisibilityComponent", + "Id": 13730791873699866292 + }, + "Component_[14036484285432839222]": { + "$type": "EditorInspectorComponent", + "Id": 14036484285432839222, + "ComponentOrderEntryArray": [ + { + "ComponentId": 9432950532896492451 + }, + { + "ComponentId": 16094906495473882735, + "SortIndex": 1 + } + ] + }, + "Component_[15490606709331567745]": { + "$type": "EditorOnlyEntityComponent", + "Id": 15490606709331567745 + }, + "Component_[17819059404707659501]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 17819059404707659501 + }, + "Component_[2317367007807622931]": { + "$type": "EditorLockComponent", + "Id": 2317367007807622931 + }, + "Component_[2676812743453687109]": { + "$type": "EditorPendingCompositionComponent", + "Id": 2676812743453687109 + }, + "Component_[3047355939801335922]": { + "$type": "EditorEntityIconComponent", + "Id": 3047355939801335922 + }, + "Component_[3687396159953003426]": { + "$type": "SelectionComponent", + "Id": 3687396159953003426 + }, + "Component_[9432950532896492451]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 9432950532896492451, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 512.0, + 512.0, + 100.0 + ] + } + } + } + }, + "Entity_[348803626828]": { + "Id": "Entity_[348803626828]", + "Name": "CharacterController", + "Components": { + "Component_[10957270521451904134]": { + "$type": "EditorOnlyEntityComponent", + "Id": 10957270521451904134 + }, + "Component_[12992548330649678626]": { + "$type": "EditorLockComponent", + "Id": 12992548330649678626 + }, + "Component_[15540557783782258382]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 15540557783782258382 + }, + "Component_[16081734969125733179]": { + "$type": "EditorEntitySortComponent", + "Id": 16081734969125733179 + }, + "Component_[1999380243426028380]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 1999380243426028380, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 511.9999694824219, + 512.0, + 34.0 + ] + } + }, + "Component_[2476703453858708137]": { + "$type": "EditorEntityIconComponent", + "Id": 2476703453858708137 + }, + "Component_[259360796349614835]": { + "$type": "EditorVisibilityComponent", + "Id": 259360796349614835 + }, + "Component_[5309782390278392323]": { + "$type": "EditorCapsuleShapeComponent", + "Id": 5309782390278392323, + "GameView": true, + "ShapeColor": [ + 0.6666666865348816, + 0.0, + 0.0 + ], + "CapsuleShape": { + "Configuration": { + "DrawColor": [ + 0.6666666865348816, + 0.0, + 0.0 + ], + "Height": 2.0 + } + } + }, + "Component_[5810440768491728833]": { + "$type": "EditorInspectorComponent", + "Id": 5810440768491728833, + "ComponentOrderEntryArray": [ + { + "ComponentId": 1999380243426028380 + }, + { + "ComponentId": 6864662272767840579, + "SortIndex": 1 + }, + { + "ComponentId": 5309782390278392323, + "SortIndex": 2 + } + ] + }, + "Component_[6654367643820201613]": { + "$type": "EditorPendingCompositionComponent", + "Id": 6654367643820201613 + }, + "Component_[6864662272767840579]": { + "$type": "EditorCharacterControllerComponent", + "Id": 6864662272767840579, + "Configuration": { + "entityId": "", + "Material": { + "MaterialIds": [ + {} + ] + } + } + }, + "Component_[9211907343705413938]": { + "$type": "SelectionComponent", + "Id": 9211907343705413938 + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/WhiteBox/EmptyLevel/EmptyLevel.prefab b/AutomatedTesting/Levels/WhiteBox/EmptyLevel/EmptyLevel.prefab new file mode 100644 index 0000000000..d03a63b2c0 --- /dev/null +++ b/AutomatedTesting/Levels/WhiteBox/EmptyLevel/EmptyLevel.prefab @@ -0,0 +1,118 @@ +{ + "ContainerEntity": { + "Id": "ContainerEntity", + "Name": "EmptyLevel", + "Components": { + "Component_[10182366347512475253]": { + "$type": "EditorPrefabComponent", + "Id": 10182366347512475253 + }, + "Component_[12917798267488243668]": { + "$type": "EditorPendingCompositionComponent", + "Id": 12917798267488243668 + }, + "Component_[3261249813163778338]": { + "$type": "EditorOnlyEntityComponent", + "Id": 3261249813163778338 + }, + "Component_[3837204912784440039]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 3837204912784440039 + }, + "Component_[4272963378099646759]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 4272963378099646759, + "Parent Entity": "" + }, + "Component_[4848458548047175816]": { + "$type": "EditorVisibilityComponent", + "Id": 4848458548047175816 + }, + "Component_[5787060997243919943]": { + "$type": "EditorInspectorComponent", + "Id": 5787060997243919943 + }, + "Component_[7804170251266531779]": { + "$type": "EditorLockComponent", + "Id": 7804170251266531779 + }, + "Component_[7874177159288365422]": { + "$type": "EditorEntitySortComponent", + "Id": 7874177159288365422 + }, + "Component_[8018146290632383969]": { + "$type": "EditorEntityIconComponent", + "Id": 8018146290632383969 + }, + "Component_[8452360690590857075]": { + "$type": "SelectionComponent", + "Id": 8452360690590857075 + } + } + }, + "Entities": { + "Entity_[273050554979]": { + "Id": "Entity_[273050554979]", + "Name": "DefaultLevelSetup", + "Components": { + "Component_[10017568850356726118]": { + "$type": "EditorEntitySortComponent", + "Id": 10017568850356726118 + }, + "Component_[13730791873699866292]": { + "$type": "EditorVisibilityComponent", + "Id": 13730791873699866292 + }, + "Component_[14036484285432839222]": { + "$type": "EditorInspectorComponent", + "Id": 14036484285432839222, + "ComponentOrderEntryArray": [ + { + "ComponentId": 9432950532896492451 + }, + { + "ComponentId": 16094906495473882735, + "SortIndex": 1 + } + ] + }, + "Component_[16744953497953161231]": { + "$type": "EditorOnlyEntityComponent", + "Id": 16744953497953161231 + }, + "Component_[17819059404707659501]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 17819059404707659501 + }, + "Component_[2317367007807622931]": { + "$type": "EditorLockComponent", + "Id": 2317367007807622931 + }, + "Component_[2676812743453687109]": { + "$type": "EditorPendingCompositionComponent", + "Id": 2676812743453687109 + }, + "Component_[3047355939801335922]": { + "$type": "EditorEntityIconComponent", + "Id": 3047355939801335922 + }, + "Component_[3687396159953003426]": { + "$type": "SelectionComponent", + "Id": 3687396159953003426 + }, + "Component_[9432950532896492451]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 9432950532896492451, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 512.0, + 512.0, + 100.0 + ] + } + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/auto_test/auto_test.prefab b/AutomatedTesting/Levels/auto_test/auto_test.prefab new file mode 100644 index 0000000000..1ac6b45cb6 --- /dev/null +++ b/AutomatedTesting/Levels/auto_test/auto_test.prefab @@ -0,0 +1,214 @@ +{ + "ContainerEntity": { + "Id": "ContainerEntity", + "Name": "auto_test", + "Components": { + "Component_[10182366347512475253]": { + "$type": "EditorPrefabComponent", + "Id": 10182366347512475253 + }, + "Component_[12917798267488243668]": { + "$type": "EditorPendingCompositionComponent", + "Id": 12917798267488243668 + }, + "Component_[3261249813163778338]": { + "$type": "EditorOnlyEntityComponent", + "Id": 3261249813163778338 + }, + "Component_[3837204912784440039]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 3837204912784440039 + }, + "Component_[4272963378099646759]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 4272963378099646759, + "Parent Entity": "" + }, + "Component_[4848458548047175816]": { + "$type": "EditorVisibilityComponent", + "Id": 4848458548047175816 + }, + "Component_[5787060997243919943]": { + "$type": "EditorInspectorComponent", + "Id": 5787060997243919943 + }, + "Component_[7804170251266531779]": { + "$type": "EditorLockComponent", + "Id": 7804170251266531779 + }, + "Component_[7874177159288365422]": { + "$type": "EditorEntitySortComponent", + "Id": 7874177159288365422 + }, + "Component_[8018146290632383969]": { + "$type": "EditorEntityIconComponent", + "Id": 8018146290632383969 + }, + "Component_[8452360690590857075]": { + "$type": "SelectionComponent", + "Id": 8452360690590857075 + } + } + }, + "Entities": { + "Entity_[212522713927]": { + "Id": "Entity_[212522713927]", + "Name": "Entity1", + "Components": { + "Component_[13533719491703491179]": { + "$type": "EditorLockComponent", + "Id": 13533719491703491179 + }, + "Component_[14279778360325346613]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 14279778360325346613, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 512.0, + 512.0, + 32.0 + ] + } + }, + "Component_[16516432490694776069]": { + "$type": "EditorPendingCompositionComponent", + "Id": 16516432490694776069 + }, + "Component_[16894842505954369943]": { + "$type": "ScriptEditorComponent", + "Id": 16894842505954369943, + "ScriptComponent": { + "Script": { + "assetId": { + "guid": "{AEB649BE-6E63-5D08-B6A6-323EE80125D9}", + "subId": 1 + }, + "assetHint": "scripts/auto_director.luac" + } + }, + "ScriptAsset": { + "assetId": { + "guid": "{AEB649BE-6E63-5D08-B6A6-323EE80125D9}", + "subId": 1 + }, + "assetHint": "scripts/auto_director.luac" + } + }, + "Component_[17917865139404413371]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 17917865139404413371 + }, + "Component_[300870010798916271]": { + "$type": "EditorOnlyEntityComponent", + "Id": 300870010798916271 + }, + "Component_[3542492159899223622]": { + "$type": "EditorEntitySortComponent", + "Id": 3542492159899223622 + }, + "Component_[5861133001616453159]": { + "$type": "SelectionComponent", + "Id": 5861133001616453159 + }, + "Component_[5861394204754691870]": { + "$type": "EditorVisibilityComponent", + "Id": 5861394204754691870 + }, + "Component_[6534723243071167847]": { + "$type": "EditorEntityIconComponent", + "Id": 6534723243071167847 + }, + "Component_[8192412641288145942]": { + "$type": "EditorInspectorComponent", + "Id": 8192412641288145942, + "ComponentOrderEntryArray": [ + { + "ComponentId": 14279778360325346613 + }, + { + "ComponentId": 16894842505954369943, + "SortIndex": 1 + } + ] + } + } + }, + "Entity_[264062321479]": { + "Id": "Entity_[264062321479]", + "Name": "Camera1", + "Components": { + "Component_[0]": { + "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent" + }, + "Component_[10250997976046839424]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 10250997976046839424, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 512.0531005859375, + 505.3736877441406, + 36.008216857910156 + ], + "Rotate": [ + 343.8316345214844, + 359.8723449707031, + 0.44026151299476624 + ], + "Scale": [ + 1.0, + 1.0, + 0.9999998807907104 + ] + } + }, + "Component_[14117951654550186353]": { + "$type": "EditorOnlyEntityComponent", + "Id": 14117951654550186353 + }, + "Component_[15441561693121796704]": { + "$type": "EditorEntitySortComponent", + "Id": 15441561693121796704 + }, + "Component_[16579888413894171159]": { + "$type": "EditorEntityIconComponent", + "Id": 16579888413894171159 + }, + "Component_[2015490294161116421]": { + "$type": "EditorVisibilityComponent", + "Id": 2015490294161116421 + }, + "Component_[2585309221365912267]": { + "$type": "EditorInspectorComponent", + "Id": 2585309221365912267, + "ComponentOrderEntryArray": [ + { + "ComponentId": 10250997976046839424 + }, + { + "ComponentId": 17989353981643488311, + "SortIndex": 1 + } + ] + }, + "Component_[4907915728143987395]": { + "$type": "SelectionComponent", + "Id": 4907915728143987395 + }, + "Component_[5911437040663285596]": { + "$type": "EditorPendingCompositionComponent", + "Id": 5911437040663285596 + }, + "Component_[8717969720874629567]": { + "$type": "EditorLockComponent", + "Id": 8717969720874629567 + }, + "Component_[992024776394048323]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 992024776394048323 + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/ocean_component/ocean_component.prefab b/AutomatedTesting/Levels/ocean_component/ocean_component.prefab new file mode 100644 index 0000000000..f2d740b77e --- /dev/null +++ b/AutomatedTesting/Levels/ocean_component/ocean_component.prefab @@ -0,0 +1,348 @@ +{ + "ContainerEntity": { + "Id": "ContainerEntity", + "Name": "ocean_component", + "Components": { + "Component_[10182366347512475253]": { + "$type": "EditorPrefabComponent", + "Id": 10182366347512475253 + }, + "Component_[12917798267488243668]": { + "$type": "EditorPendingCompositionComponent", + "Id": 12917798267488243668 + }, + "Component_[3261249813163778338]": { + "$type": "EditorOnlyEntityComponent", + "Id": 3261249813163778338 + }, + "Component_[3837204912784440039]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 3837204912784440039 + }, + "Component_[4272963378099646759]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 4272963378099646759, + "Parent Entity": "" + }, + "Component_[4848458548047175816]": { + "$type": "EditorVisibilityComponent", + "Id": 4848458548047175816 + }, + "Component_[5787060997243919943]": { + "$type": "EditorInspectorComponent", + "Id": 5787060997243919943 + }, + "Component_[7804170251266531779]": { + "$type": "EditorLockComponent", + "Id": 7804170251266531779 + }, + "Component_[7874177159288365422]": { + "$type": "EditorEntitySortComponent", + "Id": 7874177159288365422 + }, + "Component_[8018146290632383969]": { + "$type": "EditorEntityIconComponent", + "Id": 8018146290632383969 + }, + "Component_[8452360690590857075]": { + "$type": "SelectionComponent", + "Id": 8452360690590857075 + } + } + }, + "Entities": { + "Entity_[113557230075]": { + "Id": "Entity_[113557230075]", + "Name": "the_ocean", + "Components": { + "Component_[10578707299131614649]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 10578707299131614649, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 55.0, + 81.0, + 20.0 + ] + } + }, + "Component_[11046344975288527044]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 11046344975288527044 + }, + "Component_[13465592091248295601]": { + "$type": "EditorInspectorComponent", + "Id": 13465592091248295601, + "ComponentOrderEntryArray": [ + { + "ComponentId": 10578707299131614649 + }, + { + "ComponentId": 2840515548992536974, + "SortIndex": 1 + } + ] + }, + "Component_[13984822296855598165]": { + "$type": "EditorLockComponent", + "Id": 13984822296855598165 + }, + "Component_[14230937071328458692]": { + "$type": "EditorEntitySortComponent", + "Id": 14230937071328458692 + }, + "Component_[1515275142160994114]": { + "$type": "EditorPendingCompositionComponent", + "Id": 1515275142160994114 + }, + "Component_[16187876448121091850]": { + "$type": "EditorEntityIconComponent", + "Id": 16187876448121091850 + }, + "Component_[16861233641669829560]": { + "$type": "EditorOnlyEntityComponent", + "Id": 16861233641669829560 + }, + "Component_[9086259058015300489]": { + "$type": "SelectionComponent", + "Id": 9086259058015300489 + }, + "Component_[9741974704446379447]": { + "$type": "EditorVisibilityComponent", + "Id": 9741974704446379447 + } + } + }, + "Entity_[127885714554]": { + "Id": "Entity_[127885714554]", + "Name": "the_camera", + "Components": { + "Component_[0]": { + "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent" + }, + "Component_[12093754677865520350]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 12093754677865520350 + }, + "Component_[12730323471937880555]": { + "$type": "EditorEntityIconComponent", + "Id": 12730323471937880555 + }, + "Component_[13204709256342535717]": { + "$type": "EditorPendingCompositionComponent", + "Id": 13204709256342535717 + }, + "Component_[14559512685789945421]": { + "$type": "EditorLockComponent", + "Id": 14559512685789945421 + }, + "Component_[15770539414692920876]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 15770539414692920876, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 23.118545532226563, + 128.9333038330078, + 41.236572265625 + ], + "Rotate": [ + 0.12950840592384338, + 35.17909240722656, + 269.7752685546875 + ], + "Scale": [ + 1.0, + 0.9999998807907104, + 1.0 + ] + } + }, + "Component_[17658049626755079421]": { + "$type": "EditorVisibilityComponent", + "Id": 17658049626755079421 + }, + "Component_[3194947345798045730]": { + "$type": "EditorInspectorComponent", + "Id": 3194947345798045730, + "ComponentOrderEntryArray": [ + { + "ComponentId": 15770539414692920876 + }, + { + "ComponentId": 7411461277430009852, + "SortIndex": 1 + } + ] + }, + "Component_[4514043637061174274]": { + "$type": "SelectionComponent", + "Id": 4514043637061174274 + }, + "Component_[6690157295583364107]": { + "$type": "EditorEntitySortComponent", + "Id": 6690157295583364107 + }, + "Component_[8418547677002847981]": { + "$type": "EditorOnlyEntityComponent", + "Id": 8418547677002847981 + } + } + }, + "Entity_[132180681850]": { + "Id": "Entity_[132180681850]", + "Name": "the_thing", + "Components": { + "Component_[10221686237776167339]": { + "$type": "EditorOnlyEntityComponent", + "Id": 10221686237776167339 + }, + "Component_[10230254870444799387]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 10230254870444799387 + }, + "Component_[10910683815551719249]": { + "$type": "EditorEntityIconComponent", + "Id": 10910683815551719249 + }, + "Component_[1551781018072505537]": { + "$type": "EditorInspectorComponent", + "Id": 1551781018072505537, + "ComponentOrderEntryArray": [ + { + "ComponentId": 750431367071390348 + }, + { + "ComponentId": 10543707305560077725, + "SortIndex": 1 + }, + { + "ComponentId": 16828474708198673661, + "SortIndex": 2 + }, + { + "ComponentId": 6413469258372364445, + "SortIndex": 3 + } + ] + }, + "Component_[1610584700060024614]": { + "$type": "EditorEntitySortComponent", + "Id": 1610584700060024614 + }, + "Component_[1702498396513087308]": { + "$type": "EditorLockComponent", + "Id": 1702498396513087308 + }, + "Component_[191898962635170167]": { + "$type": "SelectionComponent", + "Id": 191898962635170167 + }, + "Component_[5524024140510561095]": { + "$type": "EditorVisibilityComponent", + "Id": 5524024140510561095 + }, + "Component_[7126349013266909622]": { + "$type": "EditorPendingCompositionComponent", + "Id": 7126349013266909622 + }, + "Component_[750431367071390348]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 750431367071390348, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 56.0, + 128.0, + 37.0 + ], + "Scale": [ + 2.0, + 2.0, + 2.0 + ], + "UniformScale": 2.0 + } + } + } + }, + "Entity_[285018505936]": { + "Id": "Entity_[285018505936]", + "Name": "the_comments", + "Components": { + "Component_[12254043508887231201]": { + "$type": "EditorCommentComponent", + "Id": 12254043508887231201, + "Configuration": "This level is meant to show the most basic ocean scene.\n" + }, + "Component_[13365140461414494550]": { + "$type": "EditorLockComponent", + "Id": 13365140461414494550 + }, + "Component_[15049990108511425568]": { + "$type": "EditorOnlyEntityComponent", + "Id": 15049990108511425568 + }, + "Component_[16058263010361769158]": { + "$type": "EditorCommentComponent", + "Id": 16058263010361769158, + "Configuration": "The physical object of \"the_thing\" requires the PhysicsEntities gem" + }, + "Component_[3610853239595723287]": { + "$type": "EditorInspectorComponent", + "Id": 3610853239595723287, + "ComponentOrderEntryArray": [ + { + "ComponentId": 6600498728445617807 + }, + { + "ComponentId": 12254043508887231201, + "SortIndex": 1 + }, + { + "ComponentId": 16058263010361769158, + "SortIndex": 2 + } + ] + }, + "Component_[4646570851596337987]": { + "$type": "EditorEntitySortComponent", + "Id": 4646570851596337987 + }, + "Component_[6425461812824751097]": { + "$type": "EditorEntityIconComponent", + "Id": 6425461812824751097 + }, + "Component_[6600498728445617807]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 6600498728445617807, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 19.0, + 114.0, + 32.0 + ] + } + }, + "Component_[748169014486201159]": { + "$type": "EditorVisibilityComponent", + "Id": 748169014486201159 + }, + "Component_[7489457744445094173]": { + "$type": "SelectionComponent", + "Id": 7489457744445094173 + }, + "Component_[8625778444077768294]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 8625778444077768294 + }, + "Component_[8776561997810927609]": { + "$type": "EditorPendingCompositionComponent", + "Id": 8776561997810927609 + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/ocean_trackview/ocean_trackview.prefab b/AutomatedTesting/Levels/ocean_trackview/ocean_trackview.prefab new file mode 100644 index 0000000000..648487d815 --- /dev/null +++ b/AutomatedTesting/Levels/ocean_trackview/ocean_trackview.prefab @@ -0,0 +1,736 @@ +{ + "ContainerEntity": { + "Id": "ContainerEntity", + "Name": "ocean_trackview", + "Components": { + "Component_[10182366347512475253]": { + "$type": "EditorPrefabComponent", + "Id": 10182366347512475253 + }, + "Component_[12917798267488243668]": { + "$type": "EditorPendingCompositionComponent", + "Id": 12917798267488243668 + }, + "Component_[3261249813163778338]": { + "$type": "EditorOnlyEntityComponent", + "Id": 3261249813163778338 + }, + "Component_[3837204912784440039]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 3837204912784440039 + }, + "Component_[4272963378099646759]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 4272963378099646759, + "Parent Entity": "" + }, + "Component_[4848458548047175816]": { + "$type": "EditorVisibilityComponent", + "Id": 4848458548047175816 + }, + "Component_[5787060997243919943]": { + "$type": "EditorInspectorComponent", + "Id": 5787060997243919943 + }, + "Component_[7804170251266531779]": { + "$type": "EditorLockComponent", + "Id": 7804170251266531779 + }, + "Component_[7874177159288365422]": { + "$type": "EditorEntitySortComponent", + "Id": 7874177159288365422 + }, + "Component_[8018146290632383969]": { + "$type": "EditorEntityIconComponent", + "Id": 8018146290632383969 + }, + "Component_[8452360690590857075]": { + "$type": "SelectionComponent", + "Id": 8452360690590857075 + } + } + }, + "Entities": { + "Entity_[113557230075]": { + "Id": "Entity_[113557230075]", + "Name": "the_ocean", + "Components": { + "Component_[10578707299131614649]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 10578707299131614649, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 55.0, + 81.0, + 16.0 + ] + } + }, + "Component_[11046344975288527044]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 11046344975288527044 + }, + "Component_[13465592091248295601]": { + "$type": "EditorInspectorComponent", + "Id": 13465592091248295601, + "ComponentOrderEntryArray": [ + { + "ComponentId": 10578707299131614649 + }, + { + "ComponentId": 8504984791098638268, + "SortIndex": 1 + }, + { + "ComponentId": 2840515548992536974, + "SortIndex": 2 + } + ] + }, + "Component_[13984822296855598165]": { + "$type": "EditorLockComponent", + "Id": 13984822296855598165 + }, + "Component_[14230937071328458692]": { + "$type": "EditorEntitySortComponent", + "Id": 14230937071328458692 + }, + "Component_[1515275142160994114]": { + "$type": "EditorPendingCompositionComponent", + "Id": 1515275142160994114 + }, + "Component_[16187876448121091850]": { + "$type": "EditorEntityIconComponent", + "Id": 16187876448121091850 + }, + "Component_[8504984791098638268]": { + "$type": "EditorSequenceAgentComponent", + "Id": 8504984791098638268, + "SequenceComponentEntityIds": [ + "Entity_[117514781392]" + ] + }, + "Component_[9060135739962621874]": { + "$type": "EditorOnlyEntityComponent", + "Id": 9060135739962621874 + }, + "Component_[9086259058015300489]": { + "$type": "SelectionComponent", + "Id": 9086259058015300489 + }, + "Component_[9741974704446379447]": { + "$type": "EditorVisibilityComponent", + "Id": 9741974704446379447 + } + } + }, + "Entity_[117514781392]": { + "Id": "Entity_[117514781392]", + "Name": "the_seq", + "Components": { + "Component_[10651628595557926239]": { + "$type": "EditorPendingCompositionComponent", + "Id": 10651628595557926239 + }, + "Component_[11623691525514612151]": { + "$type": "EditorInspectorComponent", + "Id": 11623691525514612151, + "ComponentOrderEntryArray": [ + { + "ComponentId": 4273477098584349604 + }, + { + "ComponentId": 5882335637425824535, + "SortIndex": 1 + } + ] + }, + "Component_[12470939899970032484]": { + "$type": "EditorEntityIconComponent", + "Id": 12470939899970032484 + }, + "Component_[14478010456841775378]": { + "$type": "EditorOnlyEntityComponent", + "Id": 14478010456841775378 + }, + "Component_[18243888196443202779]": { + "$type": "EditorLockComponent", + "Id": 18243888196443202779 + }, + "Component_[1910120971488156322]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 1910120971488156322 + }, + "Component_[2096039468306613876]": { + "$type": "EditorVisibilityComponent", + "Id": 2096039468306613876 + }, + "Component_[4273477098584349604]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 4273477098584349604, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 61.15132141113281, + 82.34228515625, + 56.032203674316406 + ] + } + }, + "Component_[4856824333512618654]": { + "$type": "SelectionComponent", + "Id": 4856824333512618654 + }, + "Component_[5882335637425824535]": { + "$type": "EditorSequenceComponent", + "Id": 5882335637425824535, + "Sequence": { + "$type": "CAnimSequence", + "Name": "the_seq", + "SequenceEntityId": "Entity_[117514781392]", + "Flags": 1, + "ID": 1, + "Nodes": [ + { + "$type": "CAnimAzEntityNode", + "ID": 1, + "Name": "the_ocean", + "Flags": 6, + "Entity": "Entity_[113557230075]" + }, + { + "$type": "CAnimComponentNode", + "ID": 2, + "Name": "Infinite Ocean", + "Tracks": [ + { + "$type": "CCompoundSplineTrack", + "ParamType": { + "Type": 8, + "Name": "FogColor" + }, + "NumSubTracks": 3, + "SubTracks": [ + { + "$type": "TAnimSplineTrack", + "DefaultValue": { + "y": 0.01568629965186119 + }, + "ParamType": { + "Type": 82 + }, + "Spline": { + "Keys": [ + { + "flags": 73, + "ds": { + "x": 1.0 + }, + "dd": { + "x": 1.0 + } + }, + { + "time": 3.0, + "flags": 73, + "value": { + "x": 3.0, + "y": 255.0 + }, + "ds": { + "x": 1.0 + }, + "dd": { + "x": 1.0 + } + }, + { + "time": 5.0, + "flags": 73, + "value": { + "x": 5.0, + "y": 255.0 + }, + "ds": { + "x": 0.6666666865348816 + }, + "dd": { + "x": 0.6666666865348816 + } + }, + { + "time": 7.699999809265137, + "flags": 73, + "value": { + "x": 7.699999809265137 + }, + "ds": { + "x": 0.8999999761581421 + }, + "dd": { + "x": 0.8999999761581421 + } + }, + { + "time": 10.0, + "flags": 73, + "value": { + "x": 10.0 + }, + "ds": { + "x": 0.766666829586029 + }, + "dd": { + "x": 0.766666829586029 + } + } + ] + }, + "Id": 2 + }, + { + "$type": "TAnimSplineTrack", + "DefaultValue": { + "y": 0.09411770105361938 + }, + "ParamType": { + "Type": 83 + }, + "Spline": { + "Keys": [ + { + "flags": 73, + "ds": { + "x": 1.0 + }, + "dd": { + "x": 1.0 + } + }, + { + "time": 3.0, + "flags": 73, + "value": { + "x": 3.0, + "y": 255.0 + }, + "ds": { + "x": 1.0 + }, + "dd": { + "x": 1.0 + } + }, + { + "time": 5.0, + "flags": 73, + "value": { + "x": 5.0, + "y": 102.50434112548828 + }, + "ds": { + "x": 0.6666666865348816 + }, + "dd": { + "x": 0.6666666865348816 + } + }, + { + "time": 7.699999809265137, + "flags": 73, + "value": { + "x": 7.699999809265137 + }, + "ds": { + "x": 0.8999999761581421 + }, + "dd": { + "x": 0.8999999761581421 + } + }, + { + "time": 10.0, + "flags": 73, + "value": { + "x": 10.0, + "y": 23.16463851928711 + }, + "ds": { + "x": 0.766666829586029 + }, + "dd": { + "x": 0.766666829586029 + } + } + ] + }, + "Id": 3 + }, + { + "$type": "TAnimSplineTrack", + "DefaultValue": { + "y": 0.1411765068769455 + }, + "ParamType": { + "Type": 84 + }, + "Spline": { + "Keys": [ + { + "flags": 73, + "ds": { + "x": 1.0 + }, + "dd": { + "x": 1.0 + } + }, + { + "time": 3.0, + "flags": 73, + "value": { + "x": 3.0, + "y": 255.0 + }, + "ds": { + "x": 1.0 + }, + "dd": { + "x": 1.0 + } + }, + { + "time": 5.0, + "flags": 73, + "value": { + "x": 5.0, + "y": 255.0 + }, + "ds": { + "x": 0.6666666865348816 + }, + "dd": { + "x": 0.6666666865348816 + } + }, + { + "time": 7.699999809265137, + "flags": 73, + "value": { + "x": 7.699999809265137, + "y": 54.11885070800781 + }, + "ds": { + "x": 0.8999999761581421 + }, + "dd": { + "x": 0.8999999761581421 + } + }, + { + "time": 10.0, + "flags": 73, + "value": { + "x": 10.0 + }, + "ds": { + "x": 0.766666829586029 + }, + "dd": { + "x": 0.766666829586029 + } + } + ] + }, + "Id": 4 + }, + null + ], + "SubTrackNames": [ + "Red", + "Green", + "Blue", + "W" + ], + "ValueType": 20, + "Id": 1 + } + ], + "Parent": 1, + "ComponentID": 2840515548992536974, + "ComponentTypeID": "{961C77CC-CB98-49B8-83C4-CB7FD6D9AB5B}" + }, + { + "$type": "CAnimComponentNode", + "ID": 3, + "Name": "Transform", + "Tracks": [ + { + "$type": "CCompoundSplineTrack", + "ParamType": { + "Type": 1, + "Name": "Position" + }, + "NumSubTracks": 3, + "SubTracks": [ + { + "$type": "TAnimSplineTrack", + "DefaultValue": { + "x": -8029758706415567000.0, + "y": 55.0 + }, + "ParamType": { + "Type": 51 + }, + "Id": 6 + }, + { + "$type": "TAnimSplineTrack", + "DefaultValue": { + "x": -8029758706415567000.0, + "y": 81.0 + }, + "ParamType": { + "Type": 52 + }, + "Id": 7 + }, + { + "$type": "TAnimSplineTrack", + "DefaultValue": { + "x": -8029758706415567000.0, + "y": 57.0 + }, + "ParamType": { + "Type": 53 + }, + "Id": 8 + }, + null + ], + "SubTrackNames": [ + "X", + "Y", + "Z", + "W" + ], + "ValueType": 1, + "Id": 5 + }, + { + "$type": "CCompoundSplineTrack", + "ParamType": { + "Type": 2, + "Name": "Rotation" + }, + "NumSubTracks": 3, + "SubTracks": [ + { + "$type": "TAnimSplineTrack", + "DefaultValue": { + "x": -8029758706415567000.0 + }, + "ParamType": { + "Type": 54 + }, + "Id": 10 + }, + { + "$type": "TAnimSplineTrack", + "DefaultValue": { + "x": -8029758706415567000.0 + }, + "ParamType": { + "Type": 55 + }, + "Id": 11 + }, + { + "$type": "TAnimSplineTrack", + "DefaultValue": { + "x": -8029758706415567000.0 + }, + "ParamType": { + "Type": 56 + }, + "Id": 12 + }, + null + ], + "SubTrackNames": [ + "X", + "Y", + "Z", + "W" + ], + "ValueType": 2, + "Id": 9 + } + ], + "Parent": 1, + "ComponentID": 10578707299131614649, + "ComponentTypeID": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0}" + } + ], + "Events": [ + "start" + ] + } + }, + "Component_[8277927932072884141]": { + "$type": "EditorEntitySortComponent", + "Id": 8277927932072884141 + } + } + }, + "Entity_[310788309712]": { + "Id": "Entity_[310788309712]", + "Name": "the_comments", + "Components": { + "Component_[10820736773970990934]": { + "$type": "SelectionComponent", + "Id": 10820736773970990934 + }, + "Component_[16460362337690040728]": { + "$type": "EditorVisibilityComponent", + "Id": 16460362337690040728 + }, + "Component_[1711788818167604478]": { + "$type": "EditorInspectorComponent", + "Id": 1711788818167604478, + "ComponentOrderEntryArray": [ + { + "ComponentId": 17162444099898225645 + }, + { + "ComponentId": 4524863805502269700, + "SortIndex": 1 + } + ] + }, + "Component_[17162444099898225645]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 17162444099898225645, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 61.0, + 82.0, + 56.0 + ] + } + }, + "Component_[17783575382365366340]": { + "$type": "EditorOnlyEntityComponent", + "Id": 17783575382365366340 + }, + "Component_[2087049458930367042]": { + "$type": "EditorLockComponent", + "Id": 2087049458930367042 + }, + "Component_[2711019276572888356]": { + "$type": "EditorEntitySortComponent", + "Id": 2711019276572888356 + }, + "Component_[4524863805502269700]": { + "$type": "EditorCommentComponent", + "Id": 4524863805502269700, + "Configuration": "This level is meant to test track view with the ocean component." + }, + "Component_[6476444408609098475]": { + "$type": "EditorPendingCompositionComponent", + "Id": 6476444408609098475 + }, + "Component_[7805954804953628853]": { + "$type": "EditorEntityIconComponent", + "Id": 7805954804953628853 + }, + "Component_[8159544250366547808]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 8159544250366547808 + } + } + }, + "Entity_[315083277008]": { + "Id": "Entity_[315083277008]", + "Name": "the_camera", + "Components": { + "Component_[0]": { + "$type": "{CA11DA46-29FF-4083-B5F6-E02C3A8C3A3D} EditorCameraComponent" + }, + "Component_[11755705402873798069]": { + "$type": "EditorVisibilityComponent", + "Id": 11755705402873798069 + }, + "Component_[11939241802298470223]": { + "$type": "EditorInspectorComponent", + "Id": 11939241802298470223, + "ComponentOrderEntryArray": [ + { + "ComponentId": 13678215694230152557 + }, + { + "ComponentId": 7780955726439597543, + "SortIndex": 1 + }, + { + "ComponentId": 14118047423140175065, + "SortIndex": 2 + } + ] + }, + "Component_[1263945907594972096]": { + "$type": "EditorPendingCompositionComponent", + "Id": 1263945907594972096 + }, + "Component_[13678215694230152557]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 13678215694230152557, + "Parent Entity": "ContainerEntity", + "Transform Data": { + "Translate": [ + 5.279235363006592, + 89.93304443359375, + 41.92418670654297 + ], + "Rotate": [ + 8.572165489196777, + 351.0418701171875, + 134.06057739257813 + ], + "Scale": [ + 0.9999998807907104, + 0.9999998807907104, + 1.0 + ] + } + }, + "Component_[16694969224252903921]": { + "$type": "SelectionComponent", + "Id": 16694969224252903921 + }, + "Component_[16770043767194988305]": { + "$type": "EditorLockComponent", + "Id": 16770043767194988305 + }, + "Component_[17615022962377688621]": { + "$type": "EditorEntityIconComponent", + "Id": 17615022962377688621 + }, + "Component_[4781886688900343222]": { + "$type": "EditorEntitySortComponent", + "Id": 4781886688900343222 + }, + "Component_[8790131188175752902]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 8790131188175752902 + }, + "Component_[9731263833327927165]": { + "$type": "EditorOnlyEntityComponent", + "Id": 9731263833327927165 + } + } + } + } +} \ No newline at end of file diff --git a/Code/Editor/Util/ImageUtil.cpp b/Code/Editor/Util/ImageUtil.cpp index 45d39f1f02..627ea9f750 100644 --- a/Code/Editor/Util/ImageUtil.cpp +++ b/Code/Editor/Util/ImageUtil.cpp @@ -143,7 +143,8 @@ bool CImageUtil::LoadPGM(const QString& fileName, CImageEx& image) fseek(file, 0, SEEK_SET); char* str = new char[fileSize]; - fread(str, fileSize, 1, file); + + [[maybe_unused]] auto bytesRead = fread(str, fileSize, 1, file); [[maybe_unused]] char* nextToken = nullptr; token = azstrtok(str, 0, seps, &nextToken); diff --git a/Code/Framework/AzCore/Tests/Platform/Android/Tests/UtilsTests_Android.cpp b/Code/Framework/AzCore/Tests/Platform/Android/Tests/UtilsTests_Android.cpp index 7ec589d103..45063bfa27 100644 --- a/Code/Framework/AzCore/Tests/Platform/Android/Tests/UtilsTests_Android.cpp +++ b/Code/Framework/AzCore/Tests/Platform/Android/Tests/UtilsTests_Android.cpp @@ -69,9 +69,11 @@ namespace UnitTest // 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 // be symlinked, so we need to perform a real path on it before comparison - char realExecutableDirectory[AZ::IO::MaxPathLength]; - ASSERT_TRUE(realpath(executableDirectory, realExecutableDirectory)); - + char* realExecutableDirectory = realpath(executableDirectory, nullptr); + ASSERT_NE(realExecutableDirectory, nullptr); + EXPECT_STRCASEEQ(realExecutableDirectory, absolutePath->c_str()); + + free(realExecutableDirectory); } } diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.cpp index 05c773f056..de6cc0042b 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.cpp @@ -383,7 +383,7 @@ namespace AZ::IO::ZipDir if (!AZ::IO::FileIOBase::GetDirectInstance()->Write(m_fileHandle, ptr, sizeToWrite)) { 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); return ZD_ERROR_IO_FAILED; } @@ -531,7 +531,7 @@ namespace AZ::IO::ZipDir if (!WriteCompressedData((uint8_t*)pUncompressed, nSegmentSize, encrypt)) { 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); return ZD_ERROR_IO_FAILED; } diff --git a/Code/Framework/AzFramework/AzFramework/SurfaceData/SurfaceData.h b/Code/Framework/AzFramework/AzFramework/SurfaceData/SurfaceData.h index 77d9ae4239..9faa03f921 100644 --- a/Code/Framework/AzFramework/AzFramework/SurfaceData/SurfaceData.h +++ b/Code/Framework/AzFramework/AzFramework/SurfaceData/SurfaceData.h @@ -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); float m_weight = 0.0f; //! A Value in the range [0.0f .. 1.0f] diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp index 7c86e00fec..999f2e9650 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp @@ -120,7 +120,7 @@ namespace AzFramework int res = chdir(processLaunchInfo.m_workingDirectory.c_str()); 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 // returning at this point would mean we would start running // the code from our parent process and that will just wreck @@ -132,15 +132,19 @@ namespace AzFramework switch (processLaunchInfo.m_processPriority) { case PROCESSPRIORITY_BELOWNORMAL: - nice(1); + { + [[maybe_unused]] auto niceResult = nice(1); // also reduce disk impact: // setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_UTILITY); break; + } case PROCESSPRIORITY_IDLE: - nice(20); + { + [[maybe_unused]] auto niceResult = nice(20); // also reduce disk impact: // setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_THROTTLE); break; + } } startupInfo.SetupHandlesForChildProcess(); @@ -153,7 +157,7 @@ namespace AzFramework // 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 // parent to read. - write(errorPipe[1], &errval, sizeof(errval)); + [[maybe_unused]] auto writeResult = write(errorPipe[1], &errval, sizeof(errval)); _exit(0); } @@ -317,7 +321,7 @@ namespace AzFramework // Set up a pipe to communicate the error code from the subprocess's execvpe call AZStd::array 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` fcntl(childErrorPipeFds[1], F_SETFD, fcntl(childErrorPipeFds[1], F_GETFD) | FD_CLOEXEC); diff --git a/Code/Framework/AzFramework/Tests/ProcessLaunchParseTests.cpp b/Code/Framework/AzFramework/Tests/ProcessLaunchParseTests.cpp index 0a7eb24df4..875051b358 100644 --- a/Code/Framework/AzFramework/Tests/ProcessLaunchParseTests.cpp +++ b/Code/Framework/AzFramework/Tests/ProcessLaunchParseTests.cpp @@ -117,11 +117,7 @@ namespace UnitTest EXPECT_EQ(param2[0], "param2val"); } -#if AZ_TRAIT_DISABLE_FAILED_PROCESS_LAUNCHER_TESTS - TEST_F(ProcessLaunchParseTests, DISABLED_ProcessLauncher_StringsWithCommas_Success) -#else TEST_F(ProcessLaunchParseTests, ProcessLauncher_WithCommas_Success) -#endif // AZ_TRAIT_DISABLE_FAILED_PROCESS_LAUNCHER_TESTS { ProcessLaunchParseTests::ParsedArgMap argMap; AzFramework::ProcessOutput processOutput; @@ -155,11 +151,7 @@ namespace UnitTest EXPECT_EQ(param2[1], "al"); } -#if AZ_TRAIT_DISABLE_FAILED_PROCESS_LAUNCHER_TESTS - TEST_F(ProcessLaunchParseTests, DISABLED_ProcessLauncher_StringsWithSpaces_Success) -#else TEST_F(ProcessLaunchParseTests, ProcessLauncher_WithSpaces_Success) -#endif // AZ_TRAIT_DISABLE_FAILED_PROCESS_LAUNCHER_TESTS { ProcessLaunchParseTests::ParsedArgMap argMap; AzFramework::ProcessOutput processOutput; @@ -191,11 +183,7 @@ namespace UnitTest EXPECT_EQ(param2[0], "param2v al"); } -#if AZ_TRAIT_DISABLE_FAILED_PROCESS_LAUNCHER_TESTS - TEST_F(ProcessLaunchParseTests, DISABLED_ProcessLauncher_StringsWithSpacesAndComma_Success) -#else TEST_F(ProcessLaunchParseTests, ProcessLauncher_WithSpacesAndComma_Success) -#endif // AZ_TRAIT_DISABLE_FAILED_PROCESS_LAUNCHER_TESTS { ProcessLaunchParseTests::ParsedArgMap argMap; AzFramework::ProcessOutput processOutput; diff --git a/Code/Framework/AzNetworking/Platform/Common/UnixLike/AzNetworking/Utilities/NetworkCommon_UnixLike.cpp b/Code/Framework/AzNetworking/Platform/Common/UnixLike/AzNetworking/Utilities/NetworkCommon_UnixLike.cpp index e2825f4afb..20dfe8b155 100644 --- a/Code/Framework/AzNetworking/Platform/Common/UnixLike/AzNetworking/Utilities/NetworkCommon_UnixLike.cpp +++ b/Code/Framework/AzNetworking/Platform/Common/UnixLike/AzNetworking/Utilities/NetworkCommon_UnixLike.cpp @@ -71,7 +71,7 @@ namespace AzNetworking const char* GetNetworkErrorDesc(int32_t errorCode) { 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; } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp index d6faed4b0a..d1d3491156 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.cpp @@ -73,7 +73,7 @@ namespace AzToolsFramework settings.m_keepDefaults = true; } - if ((flags & StoreFlags::StoreLinkIds) != StoreFlags::None) + if ((flags & StoreFlags::StripLinkIds) != StoreFlags::StripLinkIds) { settings.m_metadata.Create(); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h index e336cf0fca..d2234f423b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabDomUtils.h @@ -52,7 +52,7 @@ namespace AzToolsFramework //! We do not save linkIds to file. However when loading a level we want to temporarily save //! linkIds to instance dom so any nested prefabs will have linkIds correctly set. - StoreLinkIds = 1 << 1 + StripLinkIds = 1 << 1 }; AZ_DEFINE_ENUM_BITWISE_OPERATORS(StoreFlags); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp index c7e37258f2..62c6518d4c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabFocusHandler.cpp @@ -222,7 +222,7 @@ namespace AzToolsFramework::Prefab SetInstanceContainersOpenState(m_rootAliasFocusPath, false); const RootAliasPath previousContainerRootAliasPath = m_rootAliasFocusPath; - const InstanceOptionalConstReference previousFocusedInstance = GetInstanceReference(previousContainerRootAliasPath); + const InstanceOptionalReference previousFocusedInstance = GetInstanceReference(previousContainerRootAliasPath); m_rootAliasFocusPath = focusedInstance->get().GetAbsoluteInstanceAliasPath(); m_focusedTemplateId = focusedInstance->get().GetTemplateId(); @@ -277,7 +277,7 @@ namespace AzToolsFramework::Prefab AZ::EntityId PrefabFocusHandler::GetFocusedPrefabContainerEntityId([[maybe_unused]] AzFramework::EntityContextId entityContextId) const { - if (const InstanceOptionalConstReference instance = GetInstanceReference(m_rootAliasFocusPath); instance.has_value()) + if (const InstanceOptionalReference instance = GetInstanceReference(m_rootAliasFocusPath); instance.has_value()) { return instance->get().GetContainerEntityId(); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp index d0b057d45b..3b082fe9ff 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp @@ -331,7 +331,7 @@ namespace AzToolsFramework } PrefabDom storedPrefabDom(&loadedTemplateDom->get().GetAllocator()); - if (!PrefabDomUtils::StoreInstanceInPrefabDom(loadedPrefabInstance, storedPrefabDom, PrefabDomUtils::StoreFlags::StoreLinkIds)) + if (!PrefabDomUtils::StoreInstanceInPrefabDom(loadedPrefabInstance, storedPrefabDom)) { return false; } @@ -359,7 +359,7 @@ namespace AzToolsFramework PrefabDom storedPrefabDom(&savingTemplateDom->get().GetAllocator()); if (!PrefabDomUtils::StoreInstanceInPrefabDom(savingPrefabInstance, storedPrefabDom, - PrefabDomUtils::StoreFlags::StripDefaultValues)) + PrefabDomUtils::StoreFlags::StripDefaultValues | PrefabDomUtils::StoreFlags::StripLinkIds)) { return false; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp index 62003cd846..4101357d65 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp @@ -197,7 +197,7 @@ namespace AzToolsFramework // Update the template of the instance since the entities are modified since the template creation. Prefab::PrefabDom serializedInstance; - if (Prefab::PrefabDomUtils::StoreInstanceInPrefabDom(instanceToCreate->get(), serializedInstance)) + if (m_instanceToTemplateInterface->GenerateDomForInstance(serializedInstance, instanceToCreate->get())) { m_prefabSystemComponentInterface->UpdatePrefabTemplate(instanceToCreate->get().GetTemplateId(), serializedInstance); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 38ffb98fcb..3234aa8b2d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -163,17 +163,21 @@ namespace AzToolsFramework void PrefabSystemComponent::PropagateTemplateChanges(TemplateId templateId, InstanceOptionalConstReference instanceToExclude) { - auto templateIdToLinkIdsIterator = m_templateToLinkIdsMap.find(templateId); - if (templateIdToLinkIdsIterator != m_templateToLinkIdsMap.end()) + TemplateReference findTemplateResult = FindTemplate(templateId); + if (findTemplateResult.has_value()) { - // We need to initialize a queue here because once all linked instances of a template are updated, - // we will find all the linkIds corresponding to the updated template and add them to this queue again. - AZStd::queue linkIdsToUpdateQueue; - linkIdsToUpdateQueue.push(LinkIds(templateIdToLinkIdsIterator->second.begin(), - templateIdToLinkIdsIterator->second.end())); - UpdateLinkedInstances(linkIdsToUpdateQueue); + auto templateIdToLinkIdsIterator = m_templateToLinkIdsMap.find(templateId); + if (templateIdToLinkIdsIterator != m_templateToLinkIdsMap.end()) + { + // We need to initialize a queue here because once all linked instances of a template are updated, + // we will find all the linkIds corresponding to the updated template and add them to this queue again. + AZStd::queue linkIdsToUpdateQueue; + linkIdsToUpdateQueue.push( + LinkIds(templateIdToLinkIdsIterator->second.begin(), templateIdToLinkIdsIterator->second.end())); + UpdateLinkedInstances(linkIdsToUpdateQueue); + } + UpdatePrefabInstances(templateId, instanceToExclude); } - UpdatePrefabInstances(templateId, instanceToExclude); } void PrefabSystemComponent::UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp index dc799c235a..25879be23d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp @@ -256,7 +256,7 @@ namespace AzToolsFramework return; } - PrefabDomReference sourceDom = sourceTemplate->get().GetPrefabDom(); + PrefabDom& sourceDom = sourceTemplate->get().GetPrefabDom(); //use instance pointer to reach position PrefabDomValueReference instanceDomRef = link->get().GetLinkedInstanceDom(); @@ -274,16 +274,14 @@ namespace AzToolsFramework (result.GetOutcome() != AZ::JsonSerializationResult::Outcomes::PartialSkip), "Some of the patches are not successfully applied."); - //remove the link id placed into the instance - auto linkIdIter = instanceDom.FindMember(PrefabDomUtils::LinkIdName); - if (linkIdIter != instanceDom.MemberEnd()) - { - instanceDom.RemoveMember(PrefabDomUtils::LinkIdName); - } + // Remove the link ids if present in the doms. We don't want any overrides to be created on top of linkIds because + // linkIds are not persistent and will be created dynamically when prefabs are loaded into the editor. + instanceDom.RemoveMember(PrefabDomUtils::LinkIdName); + sourceDom.RemoveMember(PrefabDomUtils::LinkIdName); //we use this to diff our copy against the vanilla template (source template) PrefabDom patchLink; - m_instanceToTemplateInterface->GeneratePatch(patchLink, sourceDom->get(), instanceDom); + m_instanceToTemplateInterface->GeneratePatch(patchLink, sourceDom, instanceDom); // Create a copy of patchLink by providing the allocator of m_linkDomNext so that the patch doesn't become invalid when // the patch goes out of scope in this function. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/TransformComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/TransformComponent.cpp index 55961aa703..014bade347 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/TransformComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/TransformComponent.cpp @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include @@ -963,18 +963,22 @@ namespace AzToolsFramework if (!m_parentEntityId.IsValid()) { - // If Prefabs are enabled, reroute the invalid id to the level root + // If Prefabs are enabled, reroute the invalid id to the focused prefab container entity id bool isPrefabSystemEnabled = false; AzFramework::ApplicationRequests::Bus::BroadcastResult( isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); if (isPrefabSystemEnabled) { - auto prefabPublicInterface = AZ::Interface::Get(); + auto prefabFocusPublicInterface = AZ::Interface::Get(); - if (prefabPublicInterface) + if (prefabFocusPublicInterface) { - m_parentEntityId = prefabPublicInterface->GetLevelInstanceContainerEntityId(); + auto editorEntityContextId = AzFramework::EntityContextId::CreateNull(); + EditorEntityContextRequestBus::BroadcastResult( + editorEntityContextId, &EditorEntityContextRequests::GetEditorEntityContextId); + + m_parentEntityId = prefabFocusPublicInterface->GetFocusedPrefabContainerEntityId(editorEntityContextId); refreshLevel = AZ::Edit::PropertyRefreshLevels::ValuesOnly; } } diff --git a/Code/Legacy/CryCommon/ISystem.h b/Code/Legacy/CryCommon/ISystem.h index b68dd2041c..b0974818dc 100644 --- a/Code/Legacy/CryCommon/ISystem.h +++ b/Code/Legacy/CryCommon/ISystem.h @@ -1280,48 +1280,72 @@ namespace Detail #endif -#define ASSERT_CONSOLE_EXISTS 0 - // the following macros allow the help text to be easily stripped out // Summary: // Preferred way to register a CVar -#define REGISTER_CVAR(_var, _def_val, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register((#_var), &(_var), (_def_val), (_flags), CVARHELP(_comment))) +#define REGISTER_CVAR(_var, _def_val, _flags, _comment) \ + (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register((#_var), &(_var), (_def_val), (_flags), CVARHELP(_comment))) + // Summary: // Preferred way to register a CVar with a callback -#define REGISTER_CVAR_CB(_var, _def_val, _flags, _comment, _onchangefunction) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register((#_var), &(_var), (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) +#define REGISTER_CVAR_CB(_var, _def_val, _flags, _comment, _onchangefunction) \ + (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register((#_var), &(_var), (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) + // Summary: // Preferred way to register a string CVar -#define REGISTER_STRING(_name, _def_val, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterString(_name, (_def_val), (_flags), CVARHELP(_comment))) +#define REGISTER_STRING(_name, _def_val, _flags, _comment) \ + (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterString(_name, (_def_val), (_flags), CVARHELP(_comment))) + // Summary: // Preferred way to register a string CVar with a callback -#define REGISTER_STRING_CB(_name, _def_val, _flags, _comment, _onchangefunction) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterString(_name, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) +#define REGISTER_STRING_CB(_name, _def_val, _flags, _comment, _onchangefunction) \ + (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterString(_name, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) + // Summary: // Preferred way to register an int CVar -#define REGISTER_INT(_name, _def_val, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterInt(_name, (_def_val), (_flags), CVARHELP(_comment))) +#define REGISTER_INT(_name, _def_val, _flags, _comment) \ + (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterInt(_name, (_def_val), (_flags), CVARHELP(_comment))) + // Summary: // Preferred way to register an int CVar with a callback -#define REGISTER_INT_CB(_name, _def_val, _flags, _comment, _onchangefunction) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterInt(_name, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) +#define REGISTER_INT_CB(_name, _def_val, _flags, _comment, _onchangefunction) \ + (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterInt(_name, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) + // Summary: // Preferred way to register a float CVar -#define REGISTER_FLOAT(_name, _def_val, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterFloat(_name, (_def_val), (_flags), CVARHELP(_comment))) +#define REGISTER_FLOAT(_name, _def_val, _flags, _comment) \ + (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterFloat(_name, (_def_val), (_flags), CVARHELP(_comment))) + // Summary: // Offers more flexibility but more code is required -#define REGISTER_CVAR2(_name, _var, _def_val, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, _var, (_def_val), (_flags), CVARHELP(_comment))) +#define REGISTER_CVAR2(_name, _var, _def_val, _flags, _comment) \ + (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, _var, (_def_val), (_flags), CVARHELP(_comment))) + // Summary: // Offers more flexibility but more code is required -#define REGISTER_CVAR2_CB(_name, _var, _def_val, _flags, _comment, _onchangefunction) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, _var, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) +#define REGISTER_CVAR2_CB(_name, _var, _def_val, _flags, _comment, _onchangefunction) \ + (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, _var, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) + // Summary: // Offers more flexibility but more code is required, explicit address taking of destination variable -#define REGISTER_CVAR3(_name, _var, _def_val, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, &(_var), (_def_val), (_flags), CVARHELP(_comment))) +#define REGISTER_CVAR3(_name, _var, _def_val, _flags, _comment) \ + (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, &(_var), (_def_val), (_flags), CVARHELP(_comment))) + // Summary: // Preferred way to register a console command -#define REGISTER_COMMAND(_name, _func, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? false : gEnv->pConsole->AddCommand(_name, _func, (_flags), CVARHELP(_comment))) +#define REGISTER_COMMAND(_name, _func, _flags, _comment) \ + (gEnv->pConsole == 0 ? false : gEnv->pConsole->AddCommand(_name, _func, (_flags), CVARHELP(_comment))) + // Summary: // Preferred way to unregister a CVar -#define UNREGISTER_CVAR(_name) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? (void)0 : gEnv->pConsole->UnregisterVariable(_name)) +#define UNREGISTER_CVAR(_name) \ + (gEnv->pConsole == 0 ? (void)0 : gEnv->pConsole->UnregisterVariable(_name)) + +// Summary: // Preferred way to unregister a console command -#define UNREGISTER_COMMAND(_name) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? (void)0 : gEnv->pConsole->RemoveCommand(_name)) +#define UNREGISTER_COMMAND(_name) \ + (gEnv->pConsole == 0 ? (void)0 : gEnv->pConsole->RemoveCommand(_name)) //////////////////////////////////////////////////////////////////////////////// // diff --git a/Code/Legacy/CryCommon/Linux64Specific.h b/Code/Legacy/CryCommon/Linux64Specific.h index 07cb92f207..7783e48495 100644 --- a/Code/Legacy/CryCommon/Linux64Specific.h +++ b/Code/Legacy/CryCommon/Linux64Specific.h @@ -106,7 +106,7 @@ typedef uint8 byte; #ifdef _RELEASE #define __debugbreak() #else - #define __debugbreak() "_asm int 3" + #define __debugbreak() asm("int3") #endif #define __assume(x) diff --git a/Code/Tools/AzTestRunner/Platform/Common/platform_host_posix.cpp b/Code/Tools/AzTestRunner/Platform/Common/platform_host_posix.cpp index e2e0e801df..7eee861fba 100644 --- a/Code/Tools/AzTestRunner/Platform/Common/platform_host_posix.cpp +++ b/Code/Tools/AzTestRunner/Platform/Common/platform_host_posix.cpp @@ -13,7 +13,7 @@ namespace AzTestRunner { void set_quiet_mode() { - freopen("/dev/null", "a", stdout); + [[maybe_unused]] auto freopenResult = freopen("/dev/null", "a", stdout); } const char* get_current_working_directory() @@ -24,7 +24,7 @@ namespace AzTestRunner void pause_on_completion() { - system("pause"); + [[maybe_unused]] auto systemResult = system("pause"); } } diff --git a/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpUvMapImporter.cpp b/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpUvMapImporter.cpp index 9e0d788896..31c155c7eb 100644 --- a/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpUvMapImporter.cpp +++ b/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpUvMapImporter.cpp @@ -115,22 +115,22 @@ namespace AZ const aiMesh* mesh = scene->mMeshes[currentNode->mMeshes[sdkMeshIndex]]; if(mesh->mTextureCoords[texCoordIndex]) { - if (mesh->mTextureCoordsNames[texCoordIndex].length > 0) + if (mesh->HasTextureCoordsName(texCoordIndex)) { if (!customNameFound) { - name = mesh->mTextureCoordsNames[texCoordIndex].C_Str(); + name = mesh->GetTextureCoordsName(texCoordIndex)->C_Str(); customNameFound = true; } else { 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.", currentNode->mName.C_Str(), texCoordIndex, name.c_str(), - mesh->mTextureCoordsNames[texCoordIndex].C_Str(), + mesh->GetTextureCoordsName(texCoordIndex)->C_Str(), name.c_str()); } } diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Assets/Config/UserInterface_Compressed.preset b/Gems/Atom/Asset/ImageProcessingAtom/Assets/Config/UserInterface_Compressed.preset index cd1b00b2fb..c89fae1136 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Assets/Config/UserInterface_Compressed.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Assets/Config/UserInterface_Compressed.preset @@ -8,33 +8,41 @@ "Name": "UserInterface_Compressed", "SuppressEngineReduce": true, "PixelFormat": "R8G8B8A8", - "SourceColor": "Linear", - "DestColor": "Linear" + "SourceColor": "sRGB", + "DestColor": "sRGB" }, "PlatformsPresets": { "android": { "UUID": "{2828FBFE-BDF9-45A7-9370-F93822719CCF}", "Name": "UserInterface_Compressed", "SuppressEngineReduce": true, - "PixelFormat": "ASTC_4x4" + "PixelFormat": "ASTC_4x4", + "SourceColor": "sRGB", + "DestColor": "sRGB" }, "ios": { "UUID": "{2828FBFE-BDF9-45A7-9370-F93822719CCF}", "Name": "UserInterface_Compressed", "SuppressEngineReduce": true, - "PixelFormat": "ASTC_6x6" + "PixelFormat": "ASTC_6x6", + "SourceColor": "sRGB", + "DestColor": "sRGB" }, "mac": { "UUID": "{2828FBFE-BDF9-45A7-9370-F93822719CCF}", "Name": "UserInterface_Compressed", "SuppressEngineReduce": true, - "PixelFormat": "BC1" + "PixelFormat": "BC1", + "SourceColor": "sRGB", + "DestColor": "sRGB" }, "provo": { "UUID": "{2828FBFE-BDF9-45A7-9370-F93822719CCF}", "Name": "UserInterface_Compressed", "SuppressEngineReduce": true, - "PixelFormat": "BC1" + "PixelFormat": "BC1", + "SourceColor": "sRGB", + "DestColor": "sRGB" } } } diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Assets/Config/UserInterface_Lossless.preset b/Gems/Atom/Asset/ImageProcessingAtom/Assets/Config/UserInterface_Lossless.preset index bec6a604ef..e68ea9edc3 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Assets/Config/UserInterface_Lossless.preset +++ b/Gems/Atom/Asset/ImageProcessingAtom/Assets/Config/UserInterface_Lossless.preset @@ -8,33 +8,41 @@ "Name": "UserInterface_Lossless", "SuppressEngineReduce": true, "PixelFormat": "R8G8B8A8", - "SourceColor": "Linear", - "DestColor": "Linear" + "SourceColor": "sRGB", + "DestColor": "sRGB" }, "PlatformsPresets": { "android": { "UUID": "{83003128-F63E-422B-AEC2-68F0A947225F}", "Name": "UserInterface_Lossless", "SuppressEngineReduce": true, - "PixelFormat": "R8G8B8A8" + "PixelFormat": "R8G8B8A8", + "SourceColor": "sRGB", + "DestColor": "sRGB" }, "ios": { "UUID": "{83003128-F63E-422B-AEC2-68F0A947225F}", "Name": "UserInterface_Lossless", "SuppressEngineReduce": true, - "PixelFormat": "R8G8B8A8" + "PixelFormat": "R8G8B8A8", + "SourceColor": "sRGB", + "DestColor": "sRGB" }, "mac": { "UUID": "{83003128-F63E-422B-AEC2-68F0A947225F}", "Name": "UserInterface_Lossless", "SuppressEngineReduce": true, - "PixelFormat": "R8G8B8A8" + "PixelFormat": "R8G8B8A8", + "SourceColor": "sRGB", + "DestColor": "sRGB" }, "provo": { "UUID": "{83003128-F63E-422B-AEC2-68F0A947225F}", "Name": "UserInterface_Lossless", "SuppressEngineReduce": true, - "PixelFormat": "R8G8B8A8" + "PixelFormat": "R8G8B8A8", + "SourceColor": "sRGB", + "DestColor": "sRGB" } } } diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Filter.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Filter.cpp index 2b1e822db4..68e6138b23 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Filter.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Filter.cpp @@ -21,6 +21,8 @@ #define mallocAligned(sze) _aligned_malloc(sze, 16) #define freeAligned(ptr) _aligned_free(ptr) +AZ_PUSH_DISABLE_WARNING_GCC("-Wunused-value") + /* #################################################################################################################### */ @@ -1279,3 +1281,5 @@ namespace ImageProcessingAtom FilterImage(filterIndex, filterOp, blurH, blurV, srcImg, srcMip, dstImg, dstMip, srcRect, dstRect); } } + +AZ_POP_DISABLE_WARNING_GCC diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype index d4b5882f21..846c3d0f34 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR.materialtype @@ -1154,7 +1154,7 @@ { "name": "thickness", "displayName": " Thickness", - "description": "Normalized global thickness, the maxima between this value (multiplied by thickness map if enabled) and thickness from shadow map (if applicable) will be used as final thickness of pixel", + "description": "In thick transmission mode: Normalized global thickness, the maxima between this value (multiplied by thickness map if enabled) and thickness from shadow map (if applicable) will be used as final thickness of pixel\n\nIn thin transmission mode: This value modulates the distance traversed by light inside an object.", "type": "float", "defaultValue": 0.5, "min": 0.0, @@ -1223,14 +1223,41 @@ "min": 0.0, "softMax": 20.0 }, + { + "name": "shrinkFactor", + "displayName": " Shrink Factor", + "description": "Shrink (absolute) offset towards the normal opposite direction to ensure correct shadow map projection", + "type": "float", + "defaultValue": 0.005, + "min": 0.0, + "softMax": 0.05 + }, + { + "name": "transmissionNdLBias", + "displayName": " Angle Bias", + "description": "cosine of angle to extend below (N . L = 0) in scattering through thin objects", + "type": "float", + "defaultValue": 0.1, + "min": -1.0, + "softMax": 1.0 + }, + { + "name": "distanceAttenuation", + "displayName": " Distance Attenuation", + "description": "Attenuation of the transmission effect, used to hide artifacts due to low-res shadow maps\nFor directional lights: attenuation proportional to the distance from the object to the camera.\nFor other light sources: attenuation proportional to the distance from the object to the light source.", + "type": "float", + "defaultValue": 0.5, + "min": 0.0, + "softMax": 4.0 + }, { "name": "transmissionScale", "displayName": " Scale", "description": "Strength of transmission", "type": "float", - "defaultValue": 3.0, + "defaultValue": 1.0, "min": 0.0, - "softMax": 20.0 + "softMax": 5.0 } ], "detailLayerGroup": [ @@ -1555,6 +1582,9 @@ "power": "subsurfaceScattering.transmissionPower", "distortion": "subsurfaceScattering.transmissionDistortion", "attenuation": "subsurfaceScattering.transmissionAttenuation", + "shrinkFactor": "subsurfaceScattering.shrinkFactor", + "transmissionNdLBias": "subsurfaceScattering.transmissionNdLBias", + "distanceAttenuation": "subsurfaceScattering.distanceAttenuation", "tintColor": "subsurfaceScattering.transmissionTint", "thickness": "subsurfaceScattering.thickness", "enabled": "subsurfaceScattering.enableSubsurfaceScattering", diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Common.azsli b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Common.azsli index 3c35ca65be..786b0db4d7 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Common.azsli +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_Common.azsli @@ -93,7 +93,7 @@ ShaderResourceGroup MaterialSrg : SRG_PerMaterial // Elements of m_transmissionParams: // Thick object mode: (attenuation coefficient, power, distortion, scale) - // Thin object mode: (float3 scatter distance, scale) + // Thin object mode: (shrinkFactor, transmissionNdLBias, distanceAttenuation, scale) float4 m_transmissionParams; // (float3 TintColor, thickness) diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.azsl index 4b37f67930..8458ca11a2 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_ForwardPass.azsl @@ -243,6 +243,7 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float surface.transmission.tint = transmissionTintThickness.rgb; surface.transmission.thickness = transmissionTintThickness.w; surface.transmission.transmissionParams = MaterialSrg::m_transmissionParams; + surface.transmission.scatterDistance = MaterialSrg::m_scatterDistance; // ------- Anisotropy ------- @@ -275,6 +276,17 @@ PbrLightingOutput ForwardPassPS_Common(VSOutput IN, bool isFrontFace, out float lightingData.diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_diffuseOcclusionMap, MaterialSrg::m_sampler, IN.m_uv[MaterialSrg::m_diffuseOcclusionMapUvIndex], MaterialSrg::m_diffuseOcclusionFactor, o_diffuseOcclusion_useTexture); lightingData.specularOcclusion = GetOcclusionInput(MaterialSrg::m_specularOcclusionMap, MaterialSrg::m_sampler, IN.m_uv[MaterialSrg::m_specularOcclusionMapUvIndex], MaterialSrg::m_specularOcclusionFactor, o_specularOcclusion_useTexture); + // ------- Thin Object Light Transmission ------- + + // Shrink (absolute) offset towards the normal opposite direction to ensure correct shadow map projection + lightingData.shrinkFactor = surface.transmission.transmissionParams.x; + + // Angle offset for subsurface scattering through thin objects + lightingData.transmissionNdLBias = surface.transmission.transmissionParams.y; + + // Attenuation applied to hide artifacts due to low-res shadow maps + lightingData.distanceAttenuation = surface.transmission.transmissionParams.z; + // ------- Clearcoat ------- // [GFX TODO][ATOM-14603]: Clean up the double uses of these clear coat flags diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_SubsurfaceState.lua b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_SubsurfaceState.lua index e705d7867a..1f1979e3a9 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_SubsurfaceState.lua +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/EnhancedPBR_SubsurfaceState.lua @@ -92,23 +92,34 @@ function ProcessEditor(context) -- Update visibility for transmission... - local transmissionEnabled = TransmissionMode_None ~= context:GetMaterialPropertyValue_enum("subsurfaceScattering.transmissionMode") - - local commonTrasmissionVisibility - if(transmissionEnabled) then + local thickTransmissionEnabled = TransmissionMode_ThickObject == context:GetMaterialPropertyValue_enum("subsurfaceScattering.transmissionMode") + local thinTransmissionEnabled = TransmissionMode_ThinObject == context:GetMaterialPropertyValue_enum("subsurfaceScattering.transmissionMode") + + local commonTrasmissionVisibility = MaterialPropertyVisibility_Hidden + local thickTransmissionVisibility = MaterialPropertyVisibility_Hidden + local thinTransmissionVisibility = MaterialPropertyVisibility_Hidden + if (thickTransmissionEnabled or thinTransmissionEnabled) then commonTrasmissionVisibility = MaterialPropertyVisibility_Enabled - else - commonTrasmissionVisibility = MaterialPropertyVisibility_Hidden + + if(thickTransmissionEnabled) then + thickTransmissionVisibility = MaterialPropertyVisibility_Enabled + else -- thin transmission enabled + thinTransmissionVisibility = MaterialPropertyVisibility_Enabled + end end context:SetMaterialPropertyVisibility("subsurfaceScattering.thickness", commonTrasmissionVisibility) context:SetMaterialPropertyVisibility("subsurfaceScattering.thicknessMap", commonTrasmissionVisibility) context:SetMaterialPropertyVisibility("subsurfaceScattering.transmissionTint", commonTrasmissionVisibility) - context:SetMaterialPropertyVisibility("subsurfaceScattering.transmissionPower", commonTrasmissionVisibility) - context:SetMaterialPropertyVisibility("subsurfaceScattering.transmissionDistortion", commonTrasmissionVisibility) - context:SetMaterialPropertyVisibility("subsurfaceScattering.transmissionAttenuation", commonTrasmissionVisibility) + context:SetMaterialPropertyVisibility("subsurfaceScattering.transmissionPower", thickTransmissionVisibility) + context:SetMaterialPropertyVisibility("subsurfaceScattering.transmissionDistortion", thickTransmissionVisibility) + context:SetMaterialPropertyVisibility("subsurfaceScattering.transmissionAttenuation", thickTransmissionVisibility) + context:SetMaterialPropertyVisibility("subsurfaceScattering.shrinkFactor", thinTransmissionVisibility) + context:SetMaterialPropertyVisibility("subsurfaceScattering.transmissionNdLBias", thinTransmissionVisibility) + context:SetMaterialPropertyVisibility("subsurfaceScattering.distanceAttenuation", thinTransmissionVisibility) context:SetMaterialPropertyVisibility("subsurfaceScattering.transmissionScale", commonTrasmissionVisibility) - UpdateTextureDependentPropertyVisibility(context, transmissionEnabled, "subsurfaceScattering.thicknessMap", "subsurfaceScattering.useThicknessMap", "subsurfaceScattering.thicknessMapUv") + + UpdateTextureDependentPropertyVisibility(context, thickTransmissionEnabled or thinTransmissionEnabled, "subsurfaceScattering.thicknessMap", "subsurfaceScattering.useThicknessMap", "subsurfaceScattering.thicknessMapUv") end diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl index 00dee50c93..27df159583 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.azsl @@ -325,6 +325,7 @@ PbrLightingOutput SkinPS_Common(VSOutput IN) surface.transmission.tint = transmissionTintThickness.rgb; surface.transmission.thickness = transmissionTintThickness.w; surface.transmission.transmissionParams = MaterialSrg::m_transmissionParams; + surface.transmission.scatterDistance = MaterialSrg::m_scatterDistance; // ------- Lighting Data ------- @@ -341,6 +342,17 @@ PbrLightingOutput SkinPS_Common(VSOutput IN) lightingData.specularResponse = FresnelSchlickWithRoughness(lightingData.NdotV, surface.specularF0, surface.roughnessLinear); lightingData.diffuseResponse = 1.0 - lightingData.specularResponse; + // ------- Thin Object Light Transmission ------- + + // Shrink (absolute) offset towards the normal opposite direction to ensure correct shadow map projection + lightingData.shrinkFactor = surface.transmission.transmissionParams.x; + + // Angle offset for subsurface scattering through thin objects + lightingData.transmissionNdLBias = surface.transmission.transmissionParams.y; + + // Attenuation applied to hide artifacts due to low-res shadow maps + lightingData.distanceAttenuation = surface.transmission.transmissionParams.z; + // ------- Occlusion ------- lightingData.diffuseAmbientOcclusion = GetOcclusionInput(MaterialSrg::m_diffuseOcclusionMap, MaterialSrg::m_sampler, IN.m_uv[MaterialSrg::m_diffuseOcclusionMapUvIndex], MaterialSrg::m_diffuseOcclusionFactor, o_diffuseOcclusion_useTexture); diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype index a49eba7975..1edbd7e505 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin.materialtype @@ -568,7 +568,7 @@ { "name": "thickness", "displayName": " Thickness", - "description": "Normalized global thickness, the maxima between this value (multiplied by thickness map if enabled) and thickness from shadow map (if applicable) will be used as final thickness of pixel", + "description": "In thick transmission mode: Normalized global thickness, the maxima between this value (multiplied by thickness map if enabled) and thickness from shadow map (if applicable) will be used as final thickness of pixel\n\nIn thin transmission mode: This value modulates the distance traversed by light inside an object.", "type": "float", "defaultValue": 0.5, "min": 0.0, @@ -637,14 +637,41 @@ "min": 0.0, "softMax": 20.0 }, + { + "name": "shrinkFactor", + "displayName": " Shrink Factor", + "description": "Shrink (absolute) offset towards the normal opposite direction to ensure correct shadow map projection", + "type": "float", + "defaultValue": 0.005, + "min": 0.0, + "softMax": 0.05 + }, + { + "name": "transmissionNdLBias", + "displayName": " Angle Bias", + "description": "cosine of angle to extend below (N . L = 0) in scattering through thin objects", + "type": "float", + "defaultValue": 0.1, + "min": -1.0, + "softMax": 1.0 + }, + { + "name": "distanceAttenuation", + "displayName": " Distance Attenuation", + "description": "Attenuation of the transmission effect, used to hide artifacts due to low-res shadow maps\nFor directional lights: attenuation proportional to the distance from the object to the camera.\nFor other light sources: attenuation proportional to the distance from the object to the light source.", + "type": "float", + "defaultValue": 0.5, + "min": 0.0, + "softMax": 4.0 + }, { "name": "transmissionScale", "displayName": " Scale", "description": "Strength of transmission", "type": "float", - "defaultValue": 3.0, + "defaultValue": 1.0, "min": 0.0, - "softMax": 20.0 + "softMax": 5.0 } ], "wrinkleLayers": [ @@ -1011,6 +1038,9 @@ "power": "subsurfaceScattering.transmissionPower", "distortion": "subsurfaceScattering.transmissionDistortion", "attenuation": "subsurfaceScattering.transmissionAttenuation", + "shrinkFactor": "subsurfaceScattering.shrinkFactor", + "transmissionNdLBias": "subsurfaceScattering.transmissionNdLBias", + "distanceAttenuation": "subsurfaceScattering.distanceAttenuation", "tintColor": "subsurfaceScattering.transmissionTint", "thickness": "subsurfaceScattering.thickness", "enabled": "subsurfaceScattering.enableSubsurfaceScattering", diff --git a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_Common.azsli b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_Common.azsli index a94f203b23..9b3c29e96d 100644 --- a/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_Common.azsli +++ b/Gems/Atom/Feature/Common/Assets/Materials/Types/Skin_Common.azsli @@ -22,6 +22,10 @@ #include "MaterialInputs/UvSetCount.azsli" #include "MaterialInputs/DetailMapsInput.azsli" +// Use human skin profile for thin object transmission (if enabled) +// Remove this line to use a custom profile based on the scatter color +#define USE_HUMAN_SKIN_PROFILE + ShaderResourceGroup MaterialSrg : SRG_PerMaterial { // Auto-generate material SRG fields for common inputs @@ -64,7 +68,7 @@ ShaderResourceGroup MaterialSrg : SRG_PerMaterial // Elements of m_transmissionParams: // Thick object mode: (attenuation coefficient, power, distortion, scale) - // Thin object mode: (float3 scatter distance, scale) + // Thin object mode: (shrinkFactor, transmissionNdLBias, distanceAttenuation, scale) float4 m_transmissionParams; // (float3 TintColor, thickness) diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/BackLighting.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/BackLighting.azsli index d33780641d..68bc60a8dd 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/BackLighting.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/BackLighting.azsli @@ -16,24 +16,28 @@ #include // Analytical integation (approximation) of diffusion profile over radius, could be replaced by other pre integrated kernels -// such as sum of Gaussian +// such as sum of Gaussian (see T(s)) float3 TransmissionKernel(float t, float3 s) { float3 exponent = s * t; return 0.25 * (1.0 / exp(exponent) + 3.0 / exp(exponent / 3.0)); } -float ThinObjectFalloff(const float3 surfaceNormal, const float3 dirToLight) +// [specific profile for human skin] +// Analytical integation (approximation) of diffusion profile over radius, could be precomputed in a LUT +// From d'Eon and Luebke (https://developer.nvidia.com/gpugems/gpugems3/part-iii-rendering/chapter-14-advanced-techniques-realistic-real-time-skin, section 14.4.7) +float3 T(float s) { - const float ndl = saturate(dot(-surfaceNormal, dirToLight)); - - // ndl works decently well but it can produce a harsh discontinuity in the area just before - // the shadow starts appearing on objects like cylinder and tubes. - // Smoothing out ndl does a decent enough job of removing this artifact. - return smoothstep(0, 1, ndl * ndl); + // dipoles and multipoles are approximated with sums of a small number of Gaussians with variable weights and variances + return float3(0.233, 0.455, 0.649) * exp(-s*s/0.0064) + + float3(0.1, 0.336, 0.344) * exp(-s*s/0.0484) + + float3(0.118, 0.198, 0.0) * exp(-s*s/0.187) + + float3(0.113, 0.007, 0.007) * exp(-s*s/0.567) + + float3(0.358, 0.004, 0.0) * exp(-s*s/1.99) + + float3(0.078, 0.0, 0.0) * exp(-s*s/7.41); } -float3 GetBackLighting(Surface surface, LightingData lightingData, float3 lightIntensity, float3 dirToLight, float shadowRatio) +float3 GetBackLighting(Surface surface, LightingData lightingData, float3 lightIntensity, float3 dirToLight, float transmissionDistance, float attenuationDistance) { float3 result = float3(0.0, 0.0, 0.0); @@ -52,7 +56,7 @@ float3 GetBackLighting(Surface surface, LightingData lightingData, float3 lightI // https://colinbarrebrisebois.com/2011/03/07/gdc-2011-approximating-translucency-for-a-fast-cheap-and-convincing-subsurface-scattering-look/ { - thickness = max(shadowRatio, surface.transmission.thickness); + thickness = max(transmissionDistance, surface.transmission.thickness); float transmittance = pow( saturate( dot( lightingData.dirToCamera, -normalize( dirToLight + surface.normal * transmissionParams.z ) ) ), transmissionParams.y ) * transmissionParams.w; float lamberAttenuation = exp(-thickness * transmissionParams.x) * saturate(1.0 - thickness); result = transmittance * lamberAttenuation * lightIntensity; @@ -60,18 +64,39 @@ float3 GetBackLighting(Surface surface, LightingData lightingData, float3 lightI break; case TransmissionMode::ThinObject: - // Thin object mode, using thin-film assumption proposed by Jimenez J. et al, 2010, "Real-Time Realistic Skin Translucency" + // Thin object mode, based on Jimenez J. et al, 2010, "Real-Time Realistic Skin Translucency" // http://www.iryoku.com/translucency/downloads/Real-Time-Realistic-Skin-Translucency.pdf - - float litRatio = 1.0 - shadowRatio; - if (litRatio) + { - const float thickness = surface.transmission.thickness * transmissionParams.w; - const float3 invScattering = rcp(transmissionParams.xyz); - const float falloff = ThinObjectFalloff(surface.normal, dirToLight); - result = TransmissionKernel(thickness, invScattering) * falloff * lightIntensity * litRatio; - } + // transmissionDistance < 0.0f means shadows are not enabled --> avoid unnecessary computation + if (transmissionDistance < 0.0f) + { + break; + } + + // Irradiance arround surface point. + // Albedo at front (surface point) is used to approximate irradiance at the back of the object (observation 4 in [Jimenez J. et al, 2010]) + // Increase angle of influence to smooth transition regions + float3 E = surface.albedo * saturate(lightingData.transmissionNdLBias + dot(-surface.normal, dirToLight)); + + // Transmission distance modulated by hardcoded constant C and the thickness exposed parameter (in this case modulating the distance traversed by the light inside the object) + const float C = 300.0f; + float s = transmissionDistance * C * surface.transmission.thickness; + + // Use scattering color to weight thin object transmission color + const float3 invScattering = rcp(max(surface.transmission.scatterDistance, float(0.00001))); + +#ifndef USE_HUMAN_SKIN_PROFILE + // Generic profile based on scatter color + result = TransmissionKernel(s, invScattering) * lightIntensity * E * transmissionParams.w; +#else // USE_HUMAN_SKIN_PROFILE + // Profile specific to human skin + result = T(s) * lightIntensity * E * transmissionParams.w; +#endif + // Distance attenuation applied to hide artifacts due to low-res projected areas onto shadowmaps (might need some work in the future) + result /= max(1.0, attenuationDistance * attenuationDistance * lightingData.distanceAttenuation); + } break; } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/LightingData.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/LightingData.azsli index 721c9e13cc..7fe5f278da 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/LightingData.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lighting/LightingData.azsli @@ -28,6 +28,15 @@ class LightingData // Direction light shadow coordinates float3 shadowCoords[ViewSrg::MaxCascadeCount]; + // (N . L) to accept below (N . L = 0) in scattering through thin objects + float transmissionNdLBias; + + // Shrink (absolute) offset towards the normal opposite direction to ensure correct shadow map projection + float shrinkFactor; + + // Attenuation applied to hide artifacts due to low-res shadow maps + float distanceAttenuation; + // Normalized direction from surface to camera float3 dirToCamera; diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/CapsuleLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/CapsuleLight.azsli index 733ea2dbea..17fd27849d 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/CapsuleLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/CapsuleLight.azsli @@ -135,8 +135,15 @@ void ApplyCapsuleLight(ViewSrg::CapsuleLight light, Surface surface, inout Light float3 closestIntersectionPoint = startPoint + closestT * startToEnd; float3 posToLight = closestIntersectionPoint - surface.position; - // Tranmission contribution - lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, lightIntensity, normalize(posToLight), 0.0); + // Transmission contribution + // We cannot compute the actual transmission distance so we want to: + // - If transmission mode is thick object -> use transmission thickness parameter instead + // - If transmission mode is thin object -> ignore back lighting + // To detect and apply this behavior in the GetBackLighting function, we need to use a negative transmissionDistance + const float transmissionDistance = -1.0f; + // If the transmissionDistance is ignored then the attenuation distance (only used on thin objects) does not have any influence + const float attenuationDistance = 0.0f; + lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, lightIntensity, normalize(posToLight), transmissionDistance, attenuationDistance); // Calculate the offset from the nearest point on the reflection vector to the nearest point on the capsule light float3 posToClosestPointAlongReflection = dot(posToLight, reflectionDir) * reflectionDir; diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DirectionalLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DirectionalLight.azsli index 7cf10f13a3..03c48b6232 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DirectionalLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DirectionalLight.azsli @@ -18,7 +18,13 @@ void ApplyDirectionalLights(Surface surface, inout LightingData lightingData) // Shadowed check const uint shadowIndex = ViewSrg::m_shadowIndexDirectionalLight; float litRatio = 1.0f; - float backShadowRatio = 0.0f; + float camToSurfDist = distance(ViewSrg::m_worldPosition, surface.position); + + // Distance travelled by the light inside the object. If not redefined to a non-negative value, it will take the following behavior: + // - If transmission mode is thick object -> use transmission thickness parameter instead + // - If transmission mode is thin object -> ignore back lighting + float transmissionDistance = -1.0f; + if (o_enableShadows && shadowIndex < SceneSrg::m_directionalLightCount) { litRatio = DirectionalLightShadow::GetVisibility( @@ -30,7 +36,19 @@ void ApplyDirectionalLights(Surface surface, inout LightingData lightingData) #if ENABLE_TRANSMISSION if (o_transmission_mode == TransmissionMode::ThickObject) { - backShadowRatio = DirectionalLightShadow::GetThickness(shadowIndex, lightingData.shadowCoords); + transmissionDistance = DirectionalLightShadow::GetThickness(shadowIndex, lightingData.shadowCoords); + } + else if (o_transmission_mode == TransmissionMode::ThinObject) + { + // Fetch and use shrinked positions for thin object transmission to ensure they fall onto the object when querying + DirectionalLightShadow::GetShadowCoords( + shadowIndex, + surface.position - lightingData.shrinkFactor * surface.vertexNormal, + surface.normal, + lightingData.shadowCoords); + + // the depth from the shadow map + transmissionDistance = DirectionalLightShadow::GetThickness(shadowIndex, lightingData.shadowCoords); } #endif } @@ -52,23 +70,20 @@ void ApplyDirectionalLights(Surface surface, inout LightingData lightingData) // [GFX TODO][ATOM-2012] care of multiple directional light // Currently shadow check is done only for index == shadowIndex. float currentLitRatio = 1.0f; - float currentBackShadowRatio = 1.0f; - if (o_enableShadows) + float currentTransmissionDistance = -1.0f; + + if (o_enableShadows && index == shadowIndex) { - currentLitRatio = (index == shadowIndex) ? litRatio : 1.; - - currentBackShadowRatio = 1.0 - currentLitRatio; -#if ENABLE_TRANSMISSION - if (o_transmission_mode == TransmissionMode::ThickObject) - { - currentBackShadowRatio = (index == shadowIndex) ? backShadowRatio : 0.; - } -#endif + // Add contribution only if current directional light is the active one for shadows + currentLitRatio = litRatio; + currentTransmissionDistance = transmissionDistance; } + + // Transmission contribution + lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, light.m_rgbIntensityLux, dirToLight, currentTransmissionDistance, camToSurfDist); lightingData.diffuseLighting += GetDiffuseLighting(surface, lightingData, light.m_rgbIntensityLux, dirToLight) * currentLitRatio; lightingData.specularLighting += GetSpecularLighting(surface, lightingData, light.m_rgbIntensityLux, dirToLight) * currentLitRatio; - lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, light.m_rgbIntensityLux, dirToLight, currentBackShadowRatio); } // Add debug coloring for directional light shadow diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DiskLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DiskLight.azsli index 79b377c568..fff37c5d4c 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DiskLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/DiskLight.azsli @@ -76,9 +76,12 @@ void ApplyDiskLight(ViewSrg::DiskLight light, Surface surface, inout LightingDat // shadow float litRatio = 1.0; - - // How much is back face shadowed, it's set to the reverse of litRatio to share the same default value with thickness, which should be 0 if no shadow map available - float backShadowRatio = 0.0; + + // Distance travelled by the light inside the object. If not redefined to a non-negative value, it will take the following behavior: + // - If transmission mode is thick object -> use transmission thickness parameter instead + // - If transmission mode is thin object -> ignore back lighting + float transmissionDistance = -1.0f; + if (o_enableShadows) { litRatio = ProjectedShadow::GetVisibility( @@ -88,14 +91,16 @@ void ApplyDiskLight(ViewSrg::DiskLight light, Surface surface, inout LightingDat -dirToConeTip, surface.vertexNormal); - // Use backShadowRatio to carry thickness from shadow map for thick mode - backShadowRatio = 1.0 - litRatio; + + // o_transmission_mode == NONE is not taken into account because GetBackLighting already ignores this case #if ENABLE_TRANSMISSION if (o_transmission_mode == TransmissionMode::ThickObject) { - backShadowRatio = ProjectedShadow::GetThickness( - light.m_shadowIndex, - surface.position); + transmissionDistance = ProjectedShadow::GetThickness(light.m_shadowIndex, surface.position); + } + else if (o_transmission_mode == TransmissionMode::ThinObject) + { + transmissionDistance = ProjectedShadow::GetThickness(light.m_shadowIndex, surface.position - lightingData.shrinkFactor * surface.vertexNormal); } #endif } @@ -115,8 +120,8 @@ void ApplyDiskLight(ViewSrg::DiskLight light, Surface surface, inout LightingDat lightingData.diffuseLighting += GetDiffuseLighting(surface, lightingData, lightIntensity, posToLightDir) * litRatio; // Transmission contribution - lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, lightIntensity, posToLightDir, backShadowRatio); - + lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, lightIntensity, posToLightDir, transmissionDistance, distanceToLight2); + // Adjust the light direction for specular based on disk size // Calculate the reflection off the normal from the view direction diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/LightTypesCommon.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/LightTypesCommon.azsli index 16adbba280..5eeec270f9 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/LightTypesCommon.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/LightTypesCommon.azsli @@ -46,6 +46,16 @@ void AddSampleContribution( float3 intensityRgb = float3(intensity, intensity, intensity); diffuseAcc += GetDiffuseLighting(surface, lightingData, intensityRgb, posToLightSampleDir); - translucentAcc += GetBackLighting(surface, lightingData, intensityRgb, posToLightSampleDir, 0.0); + + // Transmission contribution + // We cannot compute the actual transmission distance so we want to: + // - If transmission mode is thick object -> use transmission thickness parameter instead + // - If transmission mode is thin object -> ignore back lighting + // To detect and apply this behavior in the GetBackLighting function, we need to use a negative transmissionDistance + const float transmissionDistance = -1.0f; + // If the transmissionDistance is ignored then the attenuation distance (only used on thin objects) does not have any influence + const float attenuationDistance = 0.0f; + translucentAcc += GetBackLighting(surface, lightingData, intensityRgb, posToLightSampleDir, transmissionDistance, attenuationDistance); + specularAcc += GetSpecularLighting(surface, lightingData, intensityRgb, posToLightSampleDir); } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PointLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PointLight.azsli index 883d86af48..2429ec1542 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PointLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/PointLight.azsli @@ -67,6 +67,7 @@ uint ComputeShadowIndex(const ViewSrg::PointLight light, const Surface surface) void ApplyPointLight(ViewSrg::PointLight light, Surface surface, inout LightingData lightingData) { float3 posToLight = light.m_position - surface.position; + float posToLightDist = length(posToLight); float d2 = dot(posToLight, posToLight); // light distance squared float falloff = d2 * light.m_invAttenuationRadiusSquared; @@ -84,8 +85,11 @@ void ApplyPointLight(ViewSrg::PointLight light, Surface surface, inout LightingD // shadow float litRatio = 1.0; - // How much is back face shadowed, it's set to the reverse of litRatio to share the same default value with thickness, which should be 0 if no shadow map available - float backShadowRatio = 0.0; + // Distance travelled by the light inside the object. If not redefined to a non-negative value, it will take the following behavior: + // - If transmission mode is thick object -> use transmission thickness parameter instead + // - If transmission mode is thin object -> ignore back lighting + float transmissionDistance = -1.0f; + if (o_enableShadows) { const float3 lightDir = normalize(light.m_position - surface.position); @@ -96,16 +100,17 @@ void ApplyPointLight(ViewSrg::PointLight light, Surface surface, inout LightingD surface.position, lightDir, surface.vertexNormal); - - // Use backShadowRatio to carry thickness from shadow map for thick mode - backShadowRatio = 1.0 - litRatio; + #if ENABLE_TRANSMISSION + // o_transmission_mode == NONE is not taken into account because GetBackLighting already ignores this case if (o_transmission_mode == TransmissionMode::ThickObject) { - backShadowRatio = ProjectedShadow::GetThickness( - shadowIndex, - surface.position); - } + transmissionDistance = ProjectedShadow::GetThickness(shadowIndex, surface.position); + } + else if (o_transmission_mode == TransmissionMode::ThinObject) + { + transmissionDistance = ProjectedShadow::GetThickness(shadowIndex, surface.position - lightingData.shrinkFactor * surface.vertexNormal); + } #endif } @@ -113,7 +118,7 @@ void ApplyPointLight(ViewSrg::PointLight light, Surface surface, inout LightingD lightingData.diffuseLighting += GetDiffuseLighting(surface, lightingData, lightIntensity, normalize(posToLight)) * litRatio; // Transmission contribution - lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, lightIntensity, normalize(posToLight), backShadowRatio); + lightingData.translucentBackLighting += GetBackLighting(surface, lightingData, lightIntensity, normalize(posToLight), transmissionDistance, posToLightDist); // Adjust the light direcion for specular based on bulb size diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli index a705e663c2..a2bf7cccf1 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Lights/QuadLight.azsli @@ -148,13 +148,21 @@ void ApplyQuadLight(ViewSrg::QuadLight light, Surface surface, inout LightingDat GetDiffuseLighting(surface, lightingData, intensity, dirToLightCenter) ); + // Transmission contribution + // We cannot compute the actual transmission distance so we want to: + // - If transmission mode is thick object -> use transmission thickness parameter instead + // - If transmission mode is thin object -> ignore back lighting + // To detect and apply this behavior in the GetBackLighting function, we need to use a negative transmissionDistance + const float transmissionDistance = -1.0f; + // If the transmissionDistance is ignored then the attenuation distance (only used on thin objects) does not have any influence + const float attenuationDistance = 0.0f; lightingData.translucentBackLighting += ( - GetBackLighting(surface, lightingData, intensity, p0, 0.0) + - GetBackLighting(surface, lightingData, intensity, p1, 0.0) + - GetBackLighting(surface, lightingData, intensity, p2, 0.0) + - GetBackLighting(surface, lightingData, intensity, p3, 0.0) + - GetBackLighting(surface, lightingData, intensity, dirToLightCenter, 0.0) + GetBackLighting(surface, lightingData, intensity, p0, transmissionDistance, attenuationDistance) + + GetBackLighting(surface, lightingData, intensity, p1, transmissionDistance, attenuationDistance) + + GetBackLighting(surface, lightingData, intensity, p2, transmissionDistance, attenuationDistance) + + GetBackLighting(surface, lightingData, intensity, p3, transmissionDistance, attenuationDistance) + + GetBackLighting(surface, lightingData, intensity, dirToLightCenter, transmissionDistance, attenuationDistance) ); // Calculate specular by choosing a single representative point on the light's surface based on the reflection ray diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli index dda62d85e5..a31b347960 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/PBR/Surfaces/TransmissionSurfaceData.azsli @@ -14,7 +14,8 @@ class TransmissionSurfaceData { float3 tint; float thickness; //!< pre baked local thickness, used for transmission - float4 transmissionParams; //!< parameters: thick mode->(attenuation coefficient, power, distortion, scale), thin mode: (float3 scatter distance, scale) + float4 transmissionParams; //!< parameters: thick mode->(attenuation coefficient, power, distortion, scale), thin mode: (shrinkFactor, transmissionNdLBias, distanceAttenuation, scale) + float3 scatterDistance; //!< scatter distance (same as in MaterialSrg) > void InitializeToZero(); }; @@ -24,6 +25,7 @@ void TransmissionSurfaceData::InitializeToZero() tint = float3(0.0f, 0.0f, 0.0f); thickness = 0.0f; transmissionParams = float4(0.0f, 0.0f, 0.0f, 0.0f); + scatterDistance = float3(0.0f, 0.0f, 0.0f); } #endif diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli index 870bebdf4b..f44b4e422b 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli @@ -161,7 +161,10 @@ float DirectionalLightShadow::GetThickness(uint lightIndex, float3 shadowCoords[ shadowCoord.y >= 0. && shadowCoord.y * size < size - PixelMargin && shadowCoord.z < (1. - DepthMargin)) { const float depthBufferValue = shadowmap.Sample(PassSrg::LinearSampler, float3(shadowCoord.xy, indexOfCascade)).r; - const float deltaDepth = abs(shadowCoord.z - depthBufferValue); + + // Normalized thickness (avoid negative values given by precision errors or shrinking offsets) + const float deltaDepth = max(shadowCoord.z - depthBufferValue,0.0); + const float viewSpaceThickness = ViewSrg::m_directionalLightShadows[lightIndex].m_far_minus_near * deltaDepth; return viewSpaceThickness; } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ProjectedShadow.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ProjectedShadow.azsli index 98ec9ea8bc..e6bdc13293 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ProjectedShadow.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ProjectedShadow.azsli @@ -274,8 +274,9 @@ float ProjectedShadow::GetThickness() float3(atlasPosition.xy * invAtlasSize, atlasPosition.z), /*LOD=*/0 ).r; - - const float viewSpaceThickness = abs(UnprojectDepth(m_shadowIndex, m_shadowPosition.z) - UnprojectDepth(m_shadowIndex, depthValue)); + + // Denormalized thickness (avoid negative values given by precision errors or shrinking offsets) + const float viewSpaceThickness = max(UnprojectDepth(m_shadowIndex, depthValue) - UnprojectDepth(m_shadowIndex, m_shadowPosition.z), 0.0); return viewSpaceThickness; } diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.cpp b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.cpp index 8c42160fff..b5d38e25fc 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.cpp @@ -26,6 +26,9 @@ namespace AZ ->Field("m_power", &SubsurfaceTransmissionParameterFunctor::m_power) ->Field("m_distortion", &SubsurfaceTransmissionParameterFunctor::m_distortion) ->Field("m_attenuation", &SubsurfaceTransmissionParameterFunctor::m_attenuation) + ->Field("m_shrinkFactor", &SubsurfaceTransmissionParameterFunctor::m_shrinkFactor) + ->Field("m_transmissionNdLBias", &SubsurfaceTransmissionParameterFunctor::m_transmissionNdLBias) + ->Field("m_distanceAttenuation", &SubsurfaceTransmissionParameterFunctor::m_distanceAttenuation) ->Field("m_tintColor", &SubsurfaceTransmissionParameterFunctor::m_tintColor) ->Field("m_thickness", &SubsurfaceTransmissionParameterFunctor::m_thickness) ->Field("m_enabled", &SubsurfaceTransmissionParameterFunctor::m_enabled) @@ -50,6 +53,9 @@ namespace AZ auto power = context.GetMaterialPropertyValue(m_power); auto distortion = context.GetMaterialPropertyValue(m_distortion); auto attenuation = context.GetMaterialPropertyValue(m_attenuation); + auto shrinkFactor = context.GetMaterialPropertyValue(m_shrinkFactor); + auto transmissionNdLBias = context.GetMaterialPropertyValue(m_transmissionNdLBias); + auto distanceAttenuation = context.GetMaterialPropertyValue(m_distanceAttenuation); auto tintColor = context.GetMaterialPropertyValue(m_tintColor); auto thickness = context.GetMaterialPropertyValue(m_thickness); auto scatterDistanceColor = context.GetMaterialPropertyValue(m_scatterDistanceColor); @@ -67,7 +73,9 @@ namespace AZ } else { - transmissionParams.Set(scatterDistance); + transmissionParams.SetX(shrinkFactor); + transmissionParams.SetY(transmissionNdLBias); + transmissionParams.SetZ(distanceAttenuation); transmissionParams.SetW(scale); } diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.h b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.h index e412687947..17096e71a5 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.h +++ b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.h @@ -37,6 +37,9 @@ namespace AZ RPI::MaterialPropertyIndex m_power; RPI::MaterialPropertyIndex m_distortion; RPI::MaterialPropertyIndex m_attenuation; + RPI::MaterialPropertyIndex m_shrinkFactor; + RPI::MaterialPropertyIndex m_transmissionNdLBias; + RPI::MaterialPropertyIndex m_distanceAttenuation; RPI::MaterialPropertyIndex m_tintColor; RPI::MaterialPropertyIndex m_thickness; RPI::MaterialPropertyIndex m_enabled; diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.cpp b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.cpp index a8ba40fb7f..140dfe8c6b 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.cpp @@ -25,6 +25,9 @@ namespace AZ ->Field("power", &SubsurfaceTransmissionParameterFunctorSourceData::m_power) ->Field("distortion", &SubsurfaceTransmissionParameterFunctorSourceData::m_distortion) ->Field("attenuation", &SubsurfaceTransmissionParameterFunctorSourceData::m_attenuation) + ->Field("shrinkFactor", &SubsurfaceTransmissionParameterFunctorSourceData::m_shrinkFactor) + ->Field("transmissionNdLBias", &SubsurfaceTransmissionParameterFunctorSourceData::m_transmissionNdLBias) + ->Field("distanceAttenuation", &SubsurfaceTransmissionParameterFunctorSourceData::m_distanceAttenuation) ->Field("tintColor", &SubsurfaceTransmissionParameterFunctorSourceData::m_tintColor) ->Field("thickness", &SubsurfaceTransmissionParameterFunctorSourceData::m_thickness) ->Field("enabled", &SubsurfaceTransmissionParameterFunctorSourceData::m_enabled) @@ -48,6 +51,9 @@ namespace AZ functor->m_power = context.FindMaterialPropertyIndex(Name{ m_power }); functor->m_distortion = context.FindMaterialPropertyIndex(Name{ m_distortion }); functor->m_attenuation = context.FindMaterialPropertyIndex(Name{ m_attenuation }); + functor->m_shrinkFactor = context.FindMaterialPropertyIndex(Name{ m_shrinkFactor }); + functor->m_transmissionNdLBias = context.FindMaterialPropertyIndex(Name{ m_transmissionNdLBias }); + functor->m_distanceAttenuation = context.FindMaterialPropertyIndex(Name{ m_distanceAttenuation }); functor->m_tintColor = context.FindMaterialPropertyIndex(Name{ m_tintColor }); functor->m_thickness = context.FindMaterialPropertyIndex(Name{ m_thickness }); functor->m_enabled = context.FindMaterialPropertyIndex(Name{ m_enabled }); @@ -56,7 +62,8 @@ namespace AZ if (functor->m_mode.IsNull() || functor->m_scale.IsNull() || functor->m_power.IsNull() || functor->m_distortion.IsNull() || functor->m_tintColor.IsNull() || functor->m_thickness.IsNull() || functor->m_enabled.IsNull() || functor->m_attenuation.IsNull() || functor->m_scatterDistanceColor.IsNull() || - functor->m_scatterDistanceIntensity.IsNull()) + functor->m_scatterDistanceIntensity.IsNull() || functor->m_shrinkFactor.IsNull() || functor->m_transmissionNdLBias.IsNull() || + functor->m_distanceAttenuation.IsNull()) { return Failure(); } @@ -66,6 +73,9 @@ namespace AZ AddMaterialPropertyDependency(functor, functor->m_power); AddMaterialPropertyDependency(functor, functor->m_distortion); AddMaterialPropertyDependency(functor, functor->m_attenuation); + AddMaterialPropertyDependency(functor, functor->m_shrinkFactor); + AddMaterialPropertyDependency(functor, functor->m_transmissionNdLBias); + AddMaterialPropertyDependency(functor, functor->m_distanceAttenuation); AddMaterialPropertyDependency(functor, functor->m_tintColor); AddMaterialPropertyDependency(functor, functor->m_thickness); AddMaterialPropertyDependency(functor, functor->m_enabled); diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.h b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.h index 9d074551c3..8d058243fa 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.h +++ b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.h @@ -36,6 +36,9 @@ namespace AZ AZStd::string m_power; //!< material property for thick transmission power AZStd::string m_distortion; //!< material property for thick transmission distortion towards surface normal AZStd::string m_attenuation; //!< material property for thick transmission volume absorption + AZStd::string m_shrinkFactor; //!< material property for thin transmission position shrink factor towards surface normal + AZStd::string m_transmissionNdLBias; //!< material property for thin transmission bias of the NdL value + AZStd::string m_distanceAttenuation; //!< material property for thin transmission attenuation with distance AZStd::string m_tintColor; //!< material property for transmission tint AZStd::string m_thickness; //!< material property for normalized object thickness AZStd::string m_enabled; //!< material property for subsurface scattering feature switch (enabled or disabled) diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/AssetBrowser/AtomToolsAssetBrowserInteractions.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/AssetBrowser/AtomToolsAssetBrowserInteractions.h new file mode 100644 index 0000000000..1892b1ca0c --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/AssetBrowser/AtomToolsAssetBrowserInteractions.h @@ -0,0 +1,65 @@ +/* + * 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 + * + */ + +#pragma once + +#include +#include + +class QWidget; +class QMenu; +class QAction; + +namespace AzToolsFramework +{ + namespace AssetBrowser + { + class AssetBrowserEntry; + } // namespace AssetBrowser +} // namespace AzToolsFramework + +namespace AtomToolsFramework +{ + //! Provides common asset browser interactions, source control integration, and functionality to add custom menu actions + class AtomToolsAssetBrowserInteractions : public AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler + { + public: + AZ_CLASS_ALLOCATOR(AtomToolsAssetBrowserInteractions, AZ::SystemAllocator, 0); + + AtomToolsAssetBrowserInteractions(); + ~AtomToolsAssetBrowserInteractions(); + + using AssetBrowserEntryVector = AZStd::vector; + using FilterCallback = AZStd::function; + using ActionCallback = AZStd::function; + + //! Add a filter and handler for custom context menu entries that will be added to the top of the context menu + void RegisterContextMenuActions(const FilterCallback& filterCallback, const ActionCallback& actionCallback); + + private: + //! AssetBrowserInteractionNotificationBus::Handler overrides... + void AddContextMenuActions(QWidget* caller, QMenu* menu, const AssetBrowserEntryVector& entries) override; + + void AddContextMenuActionsForSourceEntries( + QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry); + void AddContextMenuActionsForFolderEntries( + QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry); + void AddContextMenuActionsForAllEntries( + QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry); + void AddContextMenuActionsForSourceControl( + QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry); + void UpdateContextMenuActionsForSourceControl(bool success, AzToolsFramework::SourceControlFileInfo info); + + QWidget* m_caller = {}; + QAction* m_addAction = {}; + QAction* m_checkOutAction = {}; + QAction* m_undoCheckOutAction = {}; + QAction* m_getLatestAction = {}; + AZStd::vector> m_contextMenuCallbacks; + }; +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/AssetBrowser/AtomToolsAssetBrowserInteractions.cpp similarity index 52% rename from Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.cpp rename to Gems/Atom/Tools/AtomToolsFramework/Code/Source/AssetBrowser/AtomToolsAssetBrowserInteractions.cpp index 435d1f6f12..5b65356aab 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/AssetBrowser/AtomToolsAssetBrowserInteractions.cpp @@ -7,44 +7,47 @@ */ #include -#include -#include -#include -#include +#include #include #include #include #include +#include #include #include #include #include -#include -#include #include #include #include +#include #include +#include #include #include #include -namespace MaterialEditor +namespace AtomToolsFramework { - MaterialEditorBrowserInteractions::MaterialEditorBrowserInteractions() + AtomToolsAssetBrowserInteractions::AtomToolsAssetBrowserInteractions() { - using namespace AzToolsFramework::AssetBrowser; - AssetBrowserInteractionNotificationBus::Handler::BusConnect(); } - MaterialEditorBrowserInteractions::~MaterialEditorBrowserInteractions() + AtomToolsAssetBrowserInteractions::~AtomToolsAssetBrowserInteractions() { AssetBrowserInteractionNotificationBus::Handler::BusDisconnect(); } - void MaterialEditorBrowserInteractions::AddContextMenuActions(QWidget* caller, QMenu* menu, const AZStd::vector& entries) + void AtomToolsAssetBrowserInteractions::RegisterContextMenuActions( + const FilterCallback& filterCallback, const ActionCallback& actionCallback) + { + m_contextMenuCallbacks.emplace_back(filterCallback, actionCallback); + } + + void AtomToolsAssetBrowserInteractions::AddContextMenuActions( + QWidget* caller, QMenu* menu, const AssetBrowserEntryVector& entries) { AssetBrowserEntry* entry = entries.empty() ? nullptr : entries.front(); if (!entry) @@ -53,79 +56,33 @@ namespace MaterialEditor } m_caller = caller; - QObject::connect(m_caller, &QObject::destroyed, [this]() - { - m_caller = nullptr; - }); - - AddGenericContextMenuActions(caller, menu, entry); + QObject::connect(m_caller, &QObject::destroyed, [this]() { m_caller = nullptr; }); - if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source) + // Add all of the custom context menu entries first + for (const auto& contextMenuCallbackPair : m_contextMenuCallbacks) { - const auto source = azalias_cast(entry); - if (AzFramework::StringFunc::Path::IsExtension(entry->GetFullPath().c_str(), AZ::RPI::MaterialSourceData::Extension)) - { - AddContextMenuActionsForMaterialSource(caller, menu, source); - } - else if (AzFramework::StringFunc::Path::IsExtension(entry->GetFullPath().c_str(), AZ::RPI::MaterialTypeSourceData::Extension)) + if (contextMenuCallbackPair.first(entries)) { - AddContextMenuActionsForMaterialTypeSource(caller, menu, source); - } - else - { - AddContextMenuActionsForOtherSource(caller, menu, source); + contextMenuCallbackPair.second(caller, menu, entries); } } + + if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source) + { + AddContextMenuActionsForSourceEntries(caller, menu, entry); + } else if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Folder) { - const auto folder = azalias_cast(entry); - AddContextMenuActionsForFolder(caller, menu, folder); + AddContextMenuActionsForFolderEntries(caller, menu, entry); } - } - - void MaterialEditorBrowserInteractions::AddGenericContextMenuActions([[maybe_unused]] QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) - { - menu->addAction(QObject::tr("Copy Name To Clipboard"), [=]() - { - QApplication::clipboard()->setText(entry->GetName().c_str()); - }); - menu->addAction(QObject::tr("Copy Path To Clipboard"), [=]() - { - QApplication::clipboard()->setText(entry->GetFullPath().c_str()); - }); - } - void MaterialEditorBrowserInteractions::AddContextMenuActionsForMaterialTypeSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry) - { - menu->addAction(AzQtComponents::fileBrowserActionName(), [entry]() - { - AzQtComponents::ShowFileOnDesktop(entry->GetFullPath().c_str()); - }); - - menu->addSeparator(); - - menu->addAction("Create Material...", [entry]() - { - const QString defaultPath = AtomToolsFramework::GetUniqueFileInfo( - QString(AZ::Utils::GetProjectPath().c_str()) + - AZ_CORRECT_FILESYSTEM_SEPARATOR + "Assets" + - AZ_CORRECT_FILESYSTEM_SEPARATOR + "untitled." + - AZ::RPI::MaterialSourceData::Extension).absoluteFilePath(); - - AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::CreateDocumentFromFile, - entry->GetFullPath(), AtomToolsFramework::GetSaveFileInfo(defaultPath).absoluteFilePath().toUtf8().constData()); - }); - - AddPerforceMenuActions(caller, menu, entry); + AddContextMenuActionsForAllEntries(caller, menu, entry); + AddContextMenuActionsForSourceControl(caller, menu, entry); } - void MaterialEditorBrowserInteractions::AddContextMenuActionsForOtherSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry) + void AtomToolsAssetBrowserInteractions::AddContextMenuActionsForSourceEntries( + [[maybe_unused]] QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) { - menu->addAction("Open", [entry]() - { - QDesktopServices::openUrl(QUrl::fromLocalFile(entry->GetFullPath().c_str())); - }); - menu->addAction("Duplicate...", [entry]() { const QFileInfo duplicateFileInfo(AtomToolsFramework::GetDuplicationFileInfo(entry->GetFullPath().c_str())); @@ -142,79 +99,26 @@ namespace MaterialEditor } }); - menu->addAction(AzQtComponents::fileBrowserActionName(), [entry]() - { - AzQtComponents::ShowFileOnDesktop(entry->GetFullPath().c_str()); - }); - - AddPerforceMenuActions(caller, menu, entry); - } - - void MaterialEditorBrowserInteractions::AddContextMenuActionsForMaterialSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry) - { - menu->addAction("Open", [entry]() - { - AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::OpenDocument, entry->GetFullPath()); - }); - - menu->addAction("Duplicate...", [entry]() - { - const QFileInfo duplicateFileInfo(AtomToolsFramework::GetDuplicationFileInfo(entry->GetFullPath().c_str())); - if (!duplicateFileInfo.absoluteFilePath().isEmpty()) + menu->addAction("Run Python on File...", [caller, entry]() + { + const QString script = QFileDialog::getOpenFileName( + caller, QObject::tr("Run Script"), QString(AZ::Utils::GetProjectPath().c_str()), QString("*.py")); + if (!script.isEmpty()) { - if (QFile::copy(entry->GetFullPath().c_str(), duplicateFileInfo.absoluteFilePath())) - { - QFile::setPermissions(duplicateFileInfo.absoluteFilePath(), QFile::ReadOther | QFile::WriteOther); - - // Auto add file to source control - AzToolsFramework::SourceControlCommandBus::Broadcast(&AzToolsFramework::SourceControlCommandBus::Events::RequestEdit, - duplicateFileInfo.absoluteFilePath().toUtf8().constData(), true, [](bool, const AzToolsFramework::SourceControlFileInfo&) {}); - } + AZStd::vector pythonArgs{ entry->GetFullPath() }; + AzToolsFramework::EditorPythonRunnerRequestBus::Broadcast( + &AzToolsFramework::EditorPythonRunnerRequestBus::Events::ExecuteByFilenameWithArgs, script.toUtf8().constData(), + pythonArgs); } }); - - menu->addAction(AzQtComponents::fileBrowserActionName(), [entry]() - { - AzQtComponents::ShowFileOnDesktop(entry->GetFullPath().c_str()); - }); - - menu->addSeparator(); - - menu->addAction("Create Child Material...", [entry]() - { - const QString defaultPath = AtomToolsFramework::GetUniqueFileInfo( - QString(AZ::Utils::GetProjectPath().c_str()) + - AZ_CORRECT_FILESYSTEM_SEPARATOR + "Assets" + - AZ_CORRECT_FILESYSTEM_SEPARATOR + "untitled." + - AZ::RPI::MaterialSourceData::Extension).absoluteFilePath(); - - AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::CreateDocumentFromFile, - entry->GetFullPath(), AtomToolsFramework::GetSaveFileInfo(defaultPath).absoluteFilePath().toUtf8().constData()); - }); - - menu->addSeparator(); - - QAction* openParentAction = menu->addAction("Open Parent Material", [entry]() - { - AZ_UNUSED(entry); - // ToDo - }); - openParentAction->setEnabled(false); - - AddPerforceMenuActions(caller, menu, entry); } - void MaterialEditorBrowserInteractions::AddContextMenuActionsForFolder(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::FolderAssetBrowserEntry* entry) + void AtomToolsAssetBrowserInteractions::AddContextMenuActionsForFolderEntries( + QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) { - menu->addAction(AzQtComponents::fileBrowserActionName(), [entry]() + menu->addAction(QObject::tr("Create new sub folder..."), [caller, entry]() { - AzQtComponents::ShowFileOnDesktop(entry->GetFullPath().c_str()); - }); - - QAction* createFolderAction = menu->addAction(QObject::tr("Create new sub folder...")); - QObject::connect(createFolderAction, &QAction::triggered, caller, [caller, entry]() - { - bool ok; + bool ok = false; QString newFolderName = QInputDialog::getText(caller, "Enter new folder name", "name:", QLineEdit::Normal, "NewFolder", &ok); if (ok) { @@ -242,27 +146,29 @@ namespace MaterialEditor } } }); + } - menu->addSeparator(); - - QAction* createMaterialAction = menu->addAction(QObject::tr("Create Material...")); - QObject::connect(createMaterialAction, &QAction::triggered, caller, [caller, entry]() + void AtomToolsAssetBrowserInteractions::AddContextMenuActionsForAllEntries( + [[maybe_unused]] QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) + { + menu->addAction(AzQtComponents::fileBrowserActionName(), [entry]() { - CreateMaterialDialog createDialog(entry->GetFullPath().c_str(), caller); - createDialog.adjustSize(); + AzQtComponents::ShowFileOnDesktop(entry->GetFullPath().c_str()); + }); - if (createDialog.exec() == QDialog::Accepted && - !createDialog.m_materialFileInfo.absoluteFilePath().isEmpty() && - !createDialog.m_materialTypeFileInfo.absoluteFilePath().isEmpty()) - { - AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::CreateDocumentFromFile, - createDialog.m_materialTypeFileInfo.absoluteFilePath().toUtf8().constData(), - createDialog.m_materialFileInfo.absoluteFilePath().toUtf8().constData()); - } + menu->addSeparator(); + menu->addAction(QObject::tr("Copy Name To Clipboard"), [=]() + { + QApplication::clipboard()->setText(entry->GetName().c_str()); + }); + menu->addAction(QObject::tr("Copy Path To Clipboard"), [=]() + { + QApplication::clipboard()->setText(entry->GetFullPath().c_str()); }); } - void MaterialEditorBrowserInteractions::AddPerforceMenuActions([[maybe_unused]] QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) + void AtomToolsAssetBrowserInteractions::AddContextMenuActionsForSourceControl( + [[maybe_unused]] QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) { using namespace AzToolsFramework; @@ -282,7 +188,7 @@ namespace MaterialEditor QMenu::connect(sourceControlMenu, &QMenu::aboutToShow, [this, path]() { SourceControlCommandBus::Broadcast(&SourceControlCommandBus::Events::GetFileInfo, path.c_str(), - [this](bool success, const SourceControlFileInfo& info) { UpdateSourceControlActions(success, info); }); + [this](bool success, const SourceControlFileInfo& info) { UpdateContextMenuActionsForSourceControl(success, info); }); }); // add get latest action @@ -344,7 +250,7 @@ namespace MaterialEditor } } - void MaterialEditorBrowserInteractions::UpdateSourceControlActions(bool success, AzToolsFramework::SourceControlFileInfo info) + void AtomToolsAssetBrowserInteractions::UpdateContextMenuActionsForSourceControl(bool success, AzToolsFramework::SourceControlFileInfo info) { if (!success && m_caller) { @@ -367,4 +273,4 @@ namespace MaterialEditor m_undoCheckOutAction->setEnabled(info.IsManaged() && !info.IsReadOnly()); } } -} // namespace MaterialEditor +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake index 1dbfb7b686..b7f9882e92 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake @@ -9,6 +9,7 @@ set(FILES Include/AtomToolsFramework/Application/AtomToolsApplication.h Include/AtomToolsFramework/AssetBrowser/AtomToolsAssetBrowser.h + Include/AtomToolsFramework/AssetBrowser/AtomToolsAssetBrowserInteractions.h Include/AtomToolsFramework/AssetGridDialog/AssetGridDialog.h Include/AtomToolsFramework/Communication/LocalServer.h Include/AtomToolsFramework/Communication/LocalSocket.h @@ -44,6 +45,7 @@ set(FILES Source/AssetBrowser/AtomToolsAssetBrowser.cpp Source/AssetBrowser/AtomToolsAssetBrowser.qrc Source/AssetBrowser/AtomToolsAssetBrowser.ui + Source/AssetBrowser/AtomToolsAssetBrowserInteractions.cpp Source/AssetGridDialog/AssetGridDialog.cpp Source/AssetGridDialog/AssetGridDialog.ui Source/Communication/LocalServer.cpp diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSettings.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSettings.cpp deleted file mode 100644 index 256497de54..0000000000 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSettings.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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 - * - */ - -#include -#include -#include - -namespace MaterialEditor -{ - void MaterialDocumentSettings::Reflect(AZ::ReflectContext* context) - { - if (auto serializeContext = azrtti_cast(context)) - { - serializeContext->Class() - ->Version(1) - ->Field("defaultMaterialTypeName", &MaterialDocumentSettings::m_defaultMaterialTypeName) - ; - - if (auto editContext = serializeContext->GetEditContext()) - { - editContext->Class( - "MaterialDocumentSettings", "") - ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialDocumentSettings::m_defaultMaterialTypeName, "Default Material Type Name", "") - ; - } - } - - if (auto behaviorContext = azrtti_cast(context)) - { - behaviorContext->Class("MaterialDocumentSettings") - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ->Attribute(AZ::Script::Attributes::Category, "Editor") - ->Attribute(AZ::Script::Attributes::Module, "materialeditor") - ->Constructor() - ->Constructor() - ->Property("defaultMaterialTypeName", BehaviorValueProperty(&MaterialDocumentSettings::m_defaultMaterialTypeName)) - ; - } - } -} // namespace MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSettings.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSettings.h deleted file mode 100644 index 5f39c50717..0000000000 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSettings.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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 - * - */ - -#pragma once - -#if !defined(Q_MOC_RUN) -#include -#include -#include -#include -#endif - -namespace MaterialEditor -{ - struct MaterialDocumentSettings - : public AZ::UserSettings - { - AZ_RTTI(MaterialDocumentSettings, "{12E8461F-65AD-4AD2-8A1D-82C3B1183522}", AZ::UserSettings); - AZ_CLASS_ALLOCATOR(MaterialDocumentSettings, AZ::SystemAllocator, 0); - - static void Reflect(AZ::ReflectContext* context); - - AZStd::string m_defaultMaterialTypeName = "StandardPBR"; - }; -} // namespace MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.cpp index 686715017c..17453bf7af 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.cpp @@ -6,21 +6,32 @@ * */ +#include +#include +#include #include +#include #include #include #include #include +#include #include +#include #include #include -#include #include #include #include +#include #include #include +#include +#include +#include +#include + void InitMaterialEditorResources() { // Must register qt resources from other modules @@ -56,7 +67,6 @@ namespace MaterialEditor void MaterialEditorApplication::Reflect(AZ::ReflectContext* context) { Base::Reflect(context); - MaterialDocumentSettings::Reflect(context); MaterialEditorWindowSettings::Reflect(context); if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) @@ -112,8 +122,77 @@ namespace MaterialEditor void MaterialEditorApplication::CreateMainWindow() { - m_materialEditorBrowserInteractions.reset(aznew MaterialEditorBrowserInteractions); m_window.reset(aznew MaterialEditorWindow); + m_assetBrowserInteractions.reset(aznew AtomToolsFramework::AtomToolsAssetBrowserInteractions); + m_assetBrowserInteractions->RegisterContextMenuActions( + [](const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries) + { + return entries.front()->GetEntryType() == AzToolsFramework::AssetBrowser::AssetBrowserEntry::AssetEntryType::Source; + }, + []([[maybe_unused]] QWidget* caller, QMenu* menu, const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries) + { + const bool isMaterial = AzFramework::StringFunc::Path::IsExtension( + entries.front()->GetFullPath().c_str(), AZ::RPI::MaterialSourceData::Extension); + const bool isMaterialType = AzFramework::StringFunc::Path::IsExtension( + entries.front()->GetFullPath().c_str(), AZ::RPI::MaterialTypeSourceData::Extension); + if (isMaterial || isMaterialType) + { + menu->addAction(QObject::tr("Open"), [entries]() + { + AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast( + &AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::OpenDocument, + entries.front()->GetFullPath()); + }); + + const QString createActionName = + isMaterialType ? QObject::tr("Create Material...") : QObject::tr("Create Child Material..."); + + menu->addAction(createActionName, [entries]() + { + const QString defaultPath = AtomToolsFramework::GetUniqueFileInfo( + QString(AZ::Utils::GetProjectPath().c_str()) + + AZ_CORRECT_FILESYSTEM_SEPARATOR + "Assets" + + AZ_CORRECT_FILESYSTEM_SEPARATOR + "untitled." + + AZ::RPI::MaterialSourceData::Extension).absoluteFilePath(); + + AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast( + &AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::CreateDocumentFromFile, + entries.front()->GetFullPath(), + AtomToolsFramework::GetSaveFileInfo(defaultPath).absoluteFilePath().toUtf8().constData()); + }); + } + else + { + menu->addAction(QObject::tr("Open"), [entries]() + { + QDesktopServices::openUrl(QUrl::fromLocalFile(entries.front()->GetFullPath().c_str())); + }); + } + }); + + m_assetBrowserInteractions->RegisterContextMenuActions( + [](const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries) + { + return entries.front()->GetEntryType() == AzToolsFramework::AssetBrowser::AssetBrowserEntry::AssetEntryType::Folder; + }, + [](QWidget* caller, QMenu* menu, const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries) + { + menu->addAction(QObject::tr("Create Material..."), [caller, entries]() + { + CreateMaterialDialog createDialog(entries.front()->GetFullPath().c_str(), caller); + createDialog.adjustSize(); + + if (createDialog.exec() == QDialog::Accepted && + !createDialog.m_materialFileInfo.absoluteFilePath().isEmpty() && + !createDialog.m_materialTypeFileInfo.absoluteFilePath().isEmpty()) + { + AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast( + &AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::CreateDocumentFromFile, + createDialog.m_materialTypeFileInfo.absoluteFilePath().toUtf8().constData(), + createDialog.m_materialFileInfo.absoluteFilePath().toUtf8().constData()); + } + }); + }); } void MaterialEditorApplication::DestroyMainWindow() diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.h index 060353e396..0cf4354f6c 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.h @@ -8,10 +8,10 @@ #pragma once +#include #include #include #include -#include #include namespace MaterialEditor @@ -49,6 +49,6 @@ namespace MaterialEditor QWidget* GetAppMainWindow() override; AZStd::unique_ptr m_window; - AZStd::unique_ptr m_materialEditorBrowserInteractions; + AZStd::unique_ptr m_assetBrowserInteractions; }; } // namespace MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/CreateMaterialDialog/CreateMaterialDialog.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/CreateMaterialDialog/CreateMaterialDialog.cpp index 0e6cf565e3..dead08dde9 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/CreateMaterialDialog/CreateMaterialDialog.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/CreateMaterialDialog/CreateMaterialDialog.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include namespace MaterialEditor @@ -65,11 +64,10 @@ namespace MaterialEditor m_ui->m_materialTypeComboBox->model()->sort(0, Qt::AscendingOrder); - // Select the default material type from settings - auto settings = - AZ::UserSettings::CreateFind(AZ::Crc32("MaterialDocumentSettings"), AZ::UserSettings::CT_GLOBAL); + const AZStd::string defaultMaterialType = AtomToolsFramework::GetSettingOrDefault( + "/O3DE/Atom/MaterialEditor/CreateMaterialDialog/DefaultMaterialType", "StandardPBR"); - const int index = m_ui->m_materialTypeComboBox->findText(settings->m_defaultMaterialTypeName.c_str()); + const int index = m_ui->m_materialTypeComboBox->findText(defaultMaterialType.c_str()); if (index >= 0) { m_ui->m_materialTypeComboBox->setCurrentIndex(index); diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.h deleted file mode 100644 index 31043ef0a9..0000000000 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorBrowserInteractions.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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 - * - */ - -#pragma once - -#include -#include - -class QWidget; -class QMenu; -class QAction; - -namespace AzToolsFramework -{ - namespace AssetBrowser - { - class AssetBrowserEntry; - class SourceAssetBrowserEntry; - class FolderAssetBrowserEntry; - } -} - -namespace MaterialEditor -{ - class MaterialEditorBrowserInteractions - : public AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler - { - public: - AZ_CLASS_ALLOCATOR(MaterialEditorBrowserInteractions, AZ::SystemAllocator, 0); - - MaterialEditorBrowserInteractions(); - ~MaterialEditorBrowserInteractions(); - - private: - //! AssetBrowserInteractionNotificationBus::Handler overrides... - void AddContextMenuActions(QWidget* caller, QMenu* menu, const AZStd::vector& entries) override; - - void AddGenericContextMenuActions(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry); - void AddContextMenuActionsForOtherSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry); - void AddContextMenuActionsForMaterialSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry); - void AddContextMenuActionsForMaterialTypeSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry); - void AddContextMenuActionsForFolder(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::FolderAssetBrowserEntry* entry); - void AddPerforceMenuActions(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry); - - void UpdateSourceControlActions(bool success, AzToolsFramework::SourceControlFileInfo info); - - QWidget* m_caller = nullptr; - QAction* m_addAction = nullptr; - QAction* m_checkOutAction = nullptr; - QAction* m_undoCheckOutAction = nullptr; - QAction* m_getLatestAction = nullptr; - }; -} // namespace MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp index bed28d146c..da742d498d 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp @@ -146,7 +146,7 @@ namespace MaterialEditor bool MaterialEditorWindow::GetCreateDocumentParams(AZStd::string& openPath, AZStd::string& savePath) { - CreateMaterialDialog createDialog(this); + CreateMaterialDialog createDialog(openPath.c_str(), this); createDialog.adjustSize(); if (createDialog.exec() == QDialog::Accepted && diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/SettingsDialog/SettingsWidget.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/SettingsDialog/SettingsWidget.cpp index 2a061a2ed6..357dfc37e0 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/SettingsDialog/SettingsWidget.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/SettingsDialog/SettingsWidget.cpp @@ -14,8 +14,6 @@ namespace MaterialEditor SettingsWidget::SettingsWidget(QWidget* parent) : AtomToolsFramework::InspectorWidget(parent) { - m_documentSettings = - AZ::UserSettings::CreateFind(AZ_CRC_CE("MaterialDocumentSettings"), AZ::UserSettings::CT_GLOBAL); m_documentSystemSettings = AZ::UserSettings::CreateFind( AZ_CRC_CE("AtomToolsDocumentSystemSettings"), AZ::UserSettings::CT_GLOBAL); } @@ -29,23 +27,9 @@ namespace MaterialEditor { AddGroupsBegin(); AddDocumentSystemSettingsGroup(); - AddDocumentSettingsGroup(); AddGroupsEnd(); } - void SettingsWidget::AddDocumentSettingsGroup() - { - const AZStd::string groupName = "documentSettings"; - const AZStd::string groupDisplayName = "Document Settings"; - const AZStd::string groupDescription = "Document Settings"; - - const AZ::Crc32 saveStateKey(AZStd::string::format("SettingsWidget::DocumentSettingsGroup")); - AddGroup( - groupName, groupDisplayName, groupDescription, - new AtomToolsFramework::InspectorPropertyGroupWidget( - m_documentSettings.get(), nullptr, m_documentSettings->TYPEINFO_Uuid(), this, this, saveStateKey)); - } - void SettingsWidget::AddDocumentSystemSettingsGroup() { const AZStd::string groupName = "documentSystemSettings"; @@ -56,7 +40,7 @@ namespace MaterialEditor AddGroup( groupName, groupDisplayName, groupDescription, new AtomToolsFramework::InspectorPropertyGroupWidget( - m_documentSystemSettings.get(), nullptr, m_documentSystemSettings->TYPEINFO_Uuid(), this, this, saveStateKey)); + m_documentSystemSettings.get(), nullptr, m_documentSystemSettings->TYPEINFO_Uuid(), nullptr, this, saveStateKey)); } void SettingsWidget::Reset() @@ -64,21 +48,6 @@ namespace MaterialEditor AtomToolsFramework::InspectorRequestBus::Handler::BusDisconnect(); AtomToolsFramework::InspectorWidget::Reset(); } - - void SettingsWidget::BeforePropertyModified(AzToolsFramework::InstanceDataNode* pNode) - { - AZ_UNUSED(pNode); - } - - void SettingsWidget::AfterPropertyModified(AzToolsFramework::InstanceDataNode* pNode) - { - AZ_UNUSED(pNode); - } - - void SettingsWidget::SetPropertyEditingComplete(AzToolsFramework::InstanceDataNode* pNode) - { - AZ_UNUSED(pNode); - } } // namespace MaterialEditor //#include diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/SettingsDialog/SettingsWidget.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/SettingsDialog/SettingsWidget.h index e7c655ee21..2642d9d55e 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/SettingsDialog/SettingsWidget.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/SettingsDialog/SettingsWidget.h @@ -12,7 +12,6 @@ #include #include #include -#include #endif namespace MaterialEditor @@ -20,7 +19,6 @@ namespace MaterialEditor //! Provides controls for viewing and editing settings. class SettingsWidget : public AtomToolsFramework::InspectorWidget - , private AzToolsFramework::IPropertyEditorNotify { Q_OBJECT public: @@ -32,22 +30,11 @@ namespace MaterialEditor void Populate(); private: - void AddDocumentSettingsGroup(); void AddDocumentSystemSettingsGroup(); // AtomToolsFramework::InspectorRequestBus::Handler overrides... void Reset() override; - // AzToolsFramework::IPropertyEditorNotify overrides... - void BeforePropertyModified(AzToolsFramework::InstanceDataNode* pNode) override; - void AfterPropertyModified(AzToolsFramework::InstanceDataNode* pNode) override; - void SetPropertyEditingActive([[maybe_unused]] AzToolsFramework::InstanceDataNode* pNode) override {} - void SetPropertyEditingComplete(AzToolsFramework::InstanceDataNode* pNode) override; - void SealUndoStack() override {} - void RequestPropertyContextMenu(AzToolsFramework::InstanceDataNode*, const QPoint&) override {} - void PropertySelectionChanged(AzToolsFramework::InstanceDataNode*, bool) override {} - - AZStd::intrusive_ptr m_documentSettings; AZStd::intrusive_ptr m_documentSystemSettings; }; } // namespace MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/materialeditor_files.cmake b/Gems/Atom/Tools/MaterialEditor/Code/materialeditor_files.cmake index 4e270460a6..d68e013c59 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/materialeditor_files.cmake +++ b/Gems/Atom/Tools/MaterialEditor/Code/materialeditor_files.cmake @@ -12,10 +12,8 @@ set(FILES Source/MaterialEditorApplication.h Source/Document/MaterialDocumentRequestBus.h - Source/Document/MaterialDocumentSettings.h Source/Document/MaterialDocument.cpp Source/Document/MaterialDocument.h - Source/Document/MaterialDocumentSettings.cpp Source/Viewport/MaterialViewportModule.h Source/Viewport/MaterialViewportModule.cpp @@ -49,8 +47,6 @@ set(FILES Source/Viewport/MaterialViewportWidget.ui Source/Window/MaterialEditorWindowSettings.h - Source/Window/MaterialEditorBrowserInteractions.h - Source/Window/MaterialEditorBrowserInteractions.cpp Source/Window/MaterialEditorWindow.h Source/Window/MaterialEditorWindow.cpp Source/Window/MaterialEditorWindowSettings.cpp diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/ShaderManagementConsoleApplication.cpp b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/ShaderManagementConsoleApplication.cpp index aa0c378ff0..2d61730c4d 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/ShaderManagementConsoleApplication.cpp +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/ShaderManagementConsoleApplication.cpp @@ -12,12 +12,16 @@ #include #include #include +#include #include #include #include #include +#include #include +#include #include +#include #include #include #include @@ -25,11 +29,13 @@ #include #include -AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT +#include +#include #include #include +#include #include -AZ_POP_DISABLE_WARNING +#include void InitShaderManagementConsoleResources() { @@ -135,9 +141,46 @@ namespace ShaderManagementConsole void ShaderManagementConsoleApplication::CreateMainWindow() { - m_assetBrowserInteractions.reset(aznew ShaderManagementConsoleBrowserInteractions); m_window.reset(aznew ShaderManagementConsoleWindow); - m_window->show(); + m_assetBrowserInteractions.reset(aznew AtomToolsFramework::AtomToolsAssetBrowserInteractions); + m_assetBrowserInteractions->RegisterContextMenuActions( + [](const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries) + { + return entries.front()->GetEntryType() == AzToolsFramework::AssetBrowser::AssetBrowserEntry::AssetEntryType::Source; + }, + []([[maybe_unused]] QWidget* caller, QMenu* menu, const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries) + { + if (AzFramework::StringFunc::Path::IsExtension( + entries.front()->GetFullPath().c_str(), AZ::RPI::ShaderSourceData::Extension)) + { + menu->addAction("Generate Shader Variant List", [entries]() + { + const QString script = + "@engroot@/Gems/Atom/Tools/ShaderManagementConsole/Scripts/GenerateShaderVariantListForMaterials.py"; + AZStd::vector pythonArgs{ entries.front()->GetFullPath() }; + AzToolsFramework::EditorPythonRunnerRequestBus::Broadcast( + &AzToolsFramework::EditorPythonRunnerRequestBus::Events::ExecuteByFilenameWithArgs, script.toUtf8().constData(), + pythonArgs); + }); + } + else if (AzFramework::StringFunc::Path::IsExtension( + entries.front()->GetFullPath().c_str(), AZ::RPI::ShaderVariantListSourceData::Extension)) + { + menu->addAction(QObject::tr("Open"), [entries]() + { + AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast( + &AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::OpenDocument, + entries.front()->GetFullPath()); + }); + } + else + { + menu->addAction(QObject::tr("Open"), [entries]() + { + QDesktopServices::openUrl(QUrl::fromLocalFile(entries.front()->GetFullPath().c_str())); + }); + } + }); } void ShaderManagementConsoleApplication::DestroyMainWindow() diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/ShaderManagementConsoleApplication.h b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/ShaderManagementConsoleApplication.h index 3bb62d0756..232f204790 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/ShaderManagementConsoleApplication.h +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/ShaderManagementConsoleApplication.h @@ -9,11 +9,11 @@ #pragma once #include +#include #include #include #include #include -#include #include namespace ShaderManagementConsole @@ -55,6 +55,6 @@ namespace ShaderManagementConsole private: AZStd::unique_ptr m_window; - AZStd::unique_ptr m_assetBrowserInteractions; + AZStd::unique_ptr m_assetBrowserInteractions; }; } // namespace ShaderManagementConsole diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleBrowserInteractions.cpp b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleBrowserInteractions.cpp deleted file mode 100644 index ca836b1b8d..0000000000 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleBrowserInteractions.cpp +++ /dev/null @@ -1,273 +0,0 @@ -/* - * 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 - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace ShaderManagementConsole -{ - ShaderManagementConsoleBrowserInteractions::ShaderManagementConsoleBrowserInteractions() - { - using namespace AzToolsFramework::AssetBrowser; - - AssetBrowserInteractionNotificationBus::Handler::BusConnect(); - } - - ShaderManagementConsoleBrowserInteractions::~ShaderManagementConsoleBrowserInteractions() - { - AssetBrowserInteractionNotificationBus::Handler::BusDisconnect(); - } - - AzToolsFramework::AssetBrowser::SourceFileDetails ShaderManagementConsoleBrowserInteractions::GetSourceFileDetails([[maybe_unused]] const char* fullSourceFileName) - { - return AzToolsFramework::AssetBrowser::SourceFileDetails(); - } - - void ShaderManagementConsoleBrowserInteractions::AddContextMenuActions(QWidget* caller, QMenu* menu, const AZStd::vector& entries) - { - AssetBrowserEntry* entry = entries.empty() ? nullptr : entries.front(); - if (!entry) - { - return; - } - - m_caller = caller; - QObject::connect(m_caller, &QObject::destroyed, [this]() - { - m_caller = nullptr; - }); - - if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source) - { - const auto source = azalias_cast(entry); - AddContextMenuActionsForOtherSource(caller, menu, source); - } - else if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Folder) - { - const auto folder = azalias_cast(entry); - AddContextMenuActionsForFolder(caller, menu, folder); - } - } - - void ShaderManagementConsoleBrowserInteractions::AddContextMenuActionsForOtherSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry) - { - menu->addAction("Open", [entry]() - { - if (AzFramework::StringFunc::Path::IsExtension(entry->GetFullPath().c_str(), AZ::RPI::ShaderVariantListSourceData::Extension)) - { - AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::OpenDocument, entry->GetFullPath().c_str()); - } - else - { - QDesktopServices::openUrl(QUrl::fromLocalFile(entry->GetFullPath().c_str())); - } - }); - - menu->addAction("Duplicate...", [entry]() - { - const QFileInfo duplicateFileInfo(AtomToolsFramework::GetDuplicationFileInfo(entry->GetFullPath().c_str())); - if (!duplicateFileInfo.absoluteFilePath().isEmpty()) - { - if (QFile::copy(entry->GetFullPath().c_str(), duplicateFileInfo.absoluteFilePath())) - { - QFile::setPermissions(duplicateFileInfo.absoluteFilePath(), QFile::ReadOther | QFile::WriteOther); - - // Auto add file to source control - AzToolsFramework::SourceControlCommandBus::Broadcast(&AzToolsFramework::SourceControlCommandBus::Events::RequestEdit, - duplicateFileInfo.absoluteFilePath().toUtf8().constData(), true, [](bool, const AzToolsFramework::SourceControlFileInfo&) {}); - } - } - }); - - menu->addAction(AzQtComponents::fileBrowserActionName(), [entry]() - { - AzQtComponents::ShowFileOnDesktop(entry->GetFullPath().c_str()); - }); - - menu->addSeparator(); - menu->addAction("Generate Shader Variant List", [entry]() { - const QString script = "@engroot@/Gems/Atom/Tools/ShaderManagementConsole/Scripts/GenerateShaderVariantListForMaterials.py"; - AZStd::vector pythonArgs{ entry->GetFullPath() }; - AzToolsFramework::EditorPythonRunnerRequestBus::Broadcast(&AzToolsFramework::EditorPythonRunnerRequestBus::Events::ExecuteByFilenameWithArgs, script.toUtf8().constData(), pythonArgs); - }); - - menu->addAction("Run Python on Asset...", [entry]() - { - const QString script = QFileDialog::getOpenFileName(nullptr, "Run Script", QString(), QString("*.py")); - if (!script.isEmpty()) - { - AZStd::vector pythonArgs { entry->GetFullPath() }; - AzToolsFramework::EditorPythonRunnerRequestBus::Broadcast(&AzToolsFramework::EditorPythonRunnerRequestBus::Events::ExecuteByFilenameWithArgs, script.toUtf8().constData(), pythonArgs); - } - }); - - AddPerforceMenuActions(caller, menu, entry); - } - - void ShaderManagementConsoleBrowserInteractions::AddContextMenuActionsForFolder(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::FolderAssetBrowserEntry* entry) - { - menu->addAction(AzQtComponents::fileBrowserActionName(), [entry]() - { - AzQtComponents::ShowFileOnDesktop(entry->GetFullPath().c_str()); - }); - - QAction* createFolderAction = menu->addAction(QObject::tr("Create new sub folder...")); - QObject::connect(createFolderAction, &QAction::triggered, caller, [caller, entry]() - { - bool ok; - QString newFolderName = QInputDialog::getText(caller, "Enter new folder name", "name:", QLineEdit::Normal, "NewFolder", &ok); - if (ok) - { - if (newFolderName.isEmpty()) - { - QMessageBox msgBox(QMessageBox::Icon::Critical, "Error", "Folder name can't be empty", QMessageBox::Ok, caller); - msgBox.exec(); - } - else - { - AZStd::string newFolderPath; - AzFramework::StringFunc::Path::Join(entry->GetFullPath().c_str(), newFolderName.toUtf8().constData(), newFolderPath); - QDir dir(newFolderPath.c_str()); - if (dir.exists()) - { - QMessageBox::critical(caller, "Error", "Folder with this name already exists"); - return; - } - auto result = dir.mkdir(newFolderPath.c_str()); - if (!result) - { - AZ_Error("ShaderManagementConsoleBrowser", false, "Failed to make new folder"); - return; - } - } - } - }); - } - - void ShaderManagementConsoleBrowserInteractions::AddPerforceMenuActions([[maybe_unused]] QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) - { - using namespace AzToolsFramework; - - bool isActive = false; - SourceControlConnectionRequestBus::BroadcastResult(isActive, &SourceControlConnectionRequests::IsActive); - - if (isActive) - { - menu->addSeparator(); - - AZStd::string path = entry->GetFullPath(); - AzFramework::StringFunc::Path::Normalize(path); - - QMenu* sourceControlMenu = menu->addMenu("Source Control"); - - // Update the enabled state of source control menu actions only if menu is shown - QMenu::connect(sourceControlMenu, &QMenu::aboutToShow, [this, path]() - { - SourceControlCommandBus::Broadcast(&SourceControlCommandBus::Events::GetFileInfo, path.c_str(), - [this](bool success, const SourceControlFileInfo& info) { UpdateSourceControlActions(success, info); }); - }); - - // add get latest action - m_getLatestAction = sourceControlMenu->addAction("Get Latest", [path]() - { - SourceControlCommandBus::Broadcast(&SourceControlCommandBus::Events::RequestLatest, path.c_str(), - [](bool, const SourceControlFileInfo&) {}); - }); - QObject::connect(m_getLatestAction, &QObject::destroyed, [this]() - { - m_getLatestAction = nullptr; - }); - m_getLatestAction->setEnabled(false); - - // add add action - m_addAction = sourceControlMenu->addAction("Add", [path]() - { - SourceControlCommandBus::Broadcast(&SourceControlCommandBus::Events::RequestEdit, path.c_str(), true, - [path](bool, const SourceControlFileInfo&) - { - SourceControlThumbnailRequestBus::Broadcast(&SourceControlThumbnailRequests::FileStatusChanged, path.c_str()); - }); - }); - QObject::connect(m_addAction, &QObject::destroyed, [this]() - { - m_addAction = nullptr; - }); - m_addAction->setEnabled(false); - - // add checkout action - m_checkOutAction = sourceControlMenu->addAction("Check Out", [path]() - { - SourceControlCommandBus::Broadcast(&SourceControlCommandBus::Events::RequestEdit, path.c_str(), true, - [path](bool, const SourceControlFileInfo&) - { - SourceControlThumbnailRequestBus::Broadcast(&SourceControlThumbnailRequests::FileStatusChanged, path.c_str()); - }); - }); - QObject::connect(m_checkOutAction, &QObject::destroyed, [this]() - { - m_checkOutAction = nullptr; - }); - m_checkOutAction->setEnabled(false); - - // add undo checkout action - m_undoCheckOutAction = sourceControlMenu->addAction("Undo Check Out", [path]() - { - SourceControlCommandBus::Broadcast(&SourceControlCommandBus::Events::RequestRevert, path.c_str(), - [path](bool, const SourceControlFileInfo&) - { - SourceControlThumbnailRequestBus::Broadcast(&SourceControlThumbnailRequests::FileStatusChanged, path.c_str()); - }); - }); - QObject::connect(m_undoCheckOutAction, &QObject::destroyed, [this]() - { - m_undoCheckOutAction = nullptr; - }); - m_undoCheckOutAction->setEnabled(false); - } - } - - void ShaderManagementConsoleBrowserInteractions::UpdateSourceControlActions(bool success, AzToolsFramework::SourceControlFileInfo info) - { - if (!success && m_caller) - { - QMessageBox::critical(m_caller, "Error", "Source control operation failed."); - } - if (m_getLatestAction) - { - m_getLatestAction->setEnabled(info.IsManaged() && info.HasFlag(AzToolsFramework::SCF_OutOfDate)); - } - if (m_addAction) - { - m_addAction->setEnabled(!info.IsManaged()); - } - if (m_checkOutAction) - { - m_checkOutAction->setEnabled(info.IsManaged() && info.IsReadOnly() && !info.IsLockedByOther()); - } - if (m_undoCheckOutAction) - { - m_undoCheckOutAction->setEnabled(info.IsManaged() && !info.IsReadOnly()); - } - } -} // namespace ShaderManagementConsole diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleBrowserInteractions.h b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleBrowserInteractions.h deleted file mode 100644 index 996e755640..0000000000 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Window/ShaderManagementConsoleBrowserInteractions.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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 - * - */ - -#pragma once - -#include -#include - -class QWidget; -class QMenu; -class QAction; - -namespace AzToolsFramework -{ - namespace AssetBrowser - { - class AssetBrowserEntry; - class SourceAssetBrowserEntry; - class FolderAssetBrowserEntry; - } -} - -namespace ShaderManagementConsole -{ - class ShaderManagementConsoleBrowserInteractions - : public AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler - { - public: - AZ_CLASS_ALLOCATOR(ShaderManagementConsoleBrowserInteractions, AZ::SystemAllocator, 0); - - ShaderManagementConsoleBrowserInteractions(); - ~ShaderManagementConsoleBrowserInteractions(); - - private: - //////////////////////////////////////////////////////////////////////// - // AssetBrowserInteractionNotificationBus::Handler implementation - AzToolsFramework::AssetBrowser::SourceFileDetails GetSourceFileDetails(const char* fullSourceFileName) override; - void AddContextMenuActions(QWidget* caller, QMenu* menu, const AZStd::vector& entries) override; - //////////////////////////////////////////////////////////////////////// - - void AddContextMenuActionsForOtherSource(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry* entry); - void AddContextMenuActionsForFolder(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::FolderAssetBrowserEntry* entry); - void AddPerforceMenuActions(QWidget* caller, QMenu* menu, const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry); - - void UpdateSourceControlActions(bool success, AzToolsFramework::SourceControlFileInfo info); - - QWidget* m_caller = nullptr; - QAction* m_addAction = nullptr; - QAction* m_checkOutAction = nullptr; - QAction* m_undoCheckOutAction = nullptr; - QAction* m_getLatestAction = nullptr; - }; -} // namespace ShaderManagementConsole diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/shadermanagementconsole_files.cmake b/Gems/Atom/Tools/ShaderManagementConsole/Code/shadermanagementconsole_files.cmake index dac14b7f16..332cd73b40 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/shadermanagementconsole_files.cmake +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/shadermanagementconsole_files.cmake @@ -11,8 +11,6 @@ set(FILES Source/Document/ShaderManagementConsoleDocument.cpp Source/Document/ShaderManagementConsoleDocument.h - Source/Window/ShaderManagementConsoleBrowserInteractions.h - Source/Window/ShaderManagementConsoleBrowserInteractions.cpp Source/Window/ShaderManagementConsoleWindow.h Source/Window/ShaderManagementConsoleWindow.cpp Source/Window/ShaderManagementConsole.qrc diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AtomRenderPlugin.cpp b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AtomRenderPlugin.cpp index 131cbd7053..5b3f305cd0 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AtomRenderPlugin.cpp +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AtomRenderPlugin.cpp @@ -177,10 +177,19 @@ namespace EMStudio m_rotateManipulators.ConfigureView( AzToolsFramework::RotationManipulatorRadius(), AzFramework::ViewportColors::XAxisColor, AzFramework::ViewportColors::YAxisColor, AzFramework::ViewportColors::ZAxisColor); + m_rotateManipulators.InstallLeftMouseDownCallback( + [this]([[maybe_unused]]const AzToolsFramework::AngularManipulator::Action& action) + { + const AZ::EntityId entityId = m_animViewportWidget->GetAnimViewportRenderer()->GetEntityId(); + AZ::TransformBus::EventResult(m_mouseDownStartTransform, entityId, &AZ::TransformBus::Events::GetLocalTM); + }); + m_rotateManipulators.InstallMouseMoveCallback( [this](const AzToolsFramework::AngularManipulator::Action& action) { - OnManipulatorRotated(action.LocalOrientation()); + const AZ::EntityId entityId = m_animViewportWidget->GetAnimViewportRenderer()->GetEntityId(); + AZ::TransformBus::Event(entityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, + m_mouseDownStartTransform.GetRotation() * action.m_current.m_delta); }); // Setup the scale manipulator @@ -189,10 +198,21 @@ namespace EMStudio m_scaleManipulators.ConfigureView( AzToolsFramework::LinearManipulatorAxisLength(), AzFramework::ViewportColors::XAxisColor, AzFramework::ViewportColors::YAxisColor, AzFramework::ViewportColors::ZAxisColor); + m_scaleManipulators.InstallAxisLeftMouseDownCallback( + [this]([[maybe_unused]] const AzToolsFramework::LinearManipulator::Action& action) + { + const AZ::EntityId entityId = m_animViewportWidget->GetAnimViewportRenderer()->GetEntityId(); + AZ::TransformBus::EventResult(m_mouseDownStartTransform, entityId, &AZ::TransformBus::Events::GetLocalTM); + }); m_scaleManipulators.InstallAxisMouseMoveCallback( [this](const AzToolsFramework::LinearManipulator::Action& action) { - OnManipulatorScaled(action.LocalScale(), action.LocalScaleOffset()); + // Since we are compulting a uniform scale, the delta scale should be the none-zero value from one of the three axis. + const float deltaScale = action.m_current.m_localPositionOffset.GetMaxElement() + + action.m_current.m_localPositionOffset.GetMinElement(); + const AZ::EntityId entityId = m_animViewportWidget->GetAnimViewportRenderer()->GetEntityId(); + AZ::TransformBus::Event(entityId, &AZ::TransformBus::Events::SetLocalUniformScale, + m_mouseDownStartTransform.GetUniformScale() + deltaScale); }); } @@ -259,33 +279,6 @@ namespace EMStudio AZ::TransformBus::Event(entityId, &AZ::TransformBus::Events::SetLocalTranslation, position); } - void AtomRenderPlugin::OnManipulatorRotated(const AZ::Quaternion& rotation) - { - const AZ::EntityId entityId = m_animViewportWidget->GetAnimViewportRenderer()->GetEntityId(); - AZ::TransformBus::Event(entityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, rotation); - } - - void AtomRenderPlugin::OnManipulatorScaled( - const AZ::Vector3& scale, const AZ::Vector3& scaleOffset) - { - // Use the scaleOffset to determine which axis to use on the uniform scale. - float localScale = 1.0f; - if (scaleOffset.GetX() != 0.0f) - { - localScale = scale.GetX(); - } - else if (scaleOffset.GetY() != 0.0f) - { - localScale = scale.GetY(); - } - else if (scaleOffset.GetZ() != 0.0f) - { - localScale = scale.GetZ(); - } - const AZ::EntityId entityId = m_animViewportWidget->GetAnimViewportRenderer()->GetEntityId(); - AZ::TransformBus::Event(entityId, &AZ::TransformBus::Events::SetLocalUniformScale, localScale); - } - void AtomRenderPlugin::LoadRenderOptions() { AZStd::string renderOptionsFilename(GetManager()->GetAppDataFolder()); diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AtomRenderPlugin.h b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AtomRenderPlugin.h index 23980ddc0d..2207690628 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AtomRenderPlugin.h +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Tools/EMStudio/AtomRenderPlugin.h @@ -70,8 +70,6 @@ namespace EMStudio void SetupManipulators(); void OnManipulatorMoved(const AZ::Vector3& position); - void OnManipulatorRotated(const AZ::Quaternion& rotation); - void OnManipulatorScaled(const AZ::Vector3& scale, const AZ::Vector3& scaleOffset); QWidget* m_innerWidget = nullptr; AnimViewportWidget* m_animViewportWidget = nullptr; @@ -82,6 +80,7 @@ namespace EMStudio AzToolsFramework::RotationManipulators m_rotateManipulators; AzToolsFramework::ScaleManipulators m_scaleManipulators; AZStd::shared_ptr m_manipulatorManager; + AZ::Transform m_mouseDownStartTransform; MCORE_DEFINECOMMANDCALLBACK(ImportActorCallback); MCORE_DEFINECOMMANDCALLBACK(RemoveActorCallback); diff --git a/Gems/AtomTressFX/External/Code/src/TressFX/TressFXAsset.cpp b/Gems/AtomTressFX/External/Code/src/TressFX/TressFXAsset.cpp index 58c66c3b8c..c2ce6a5ffe 100644 --- a/Gems/AtomTressFX/External/Code/src/TressFX/TressFXAsset.cpp +++ b/Gems/AtomTressFX/External/Code/src/TressFX/TressFXAsset.cpp @@ -282,8 +282,8 @@ namespace AMD TressFXTFXFileHeader header = {}; // read the header - EI_Seek(ioObject, 0); // make sure the stream pos is at the beginning. - EI_Read((void*)&header, sizeof(TressFXTFXFileHeader), ioObject); + [[maybe_unused]] auto eiSeekResult = EI_Seek(ioObject, 0); // make sure the stream pos is at the beginning. + [[maybe_unused]] auto eiReadResult = EI_Read((void*)&header, sizeof(TressFXTFXFileHeader), ioObject); // If the tfx version is lower than the current major version, exit. if (header.version < AMD_TRESSFX_VERSION_MAJOR) @@ -317,8 +317,8 @@ namespace AMD m_positions.resize(m_numTotalVertices); // size of m_positions = number of total vertices * sizeo of each position vector. // Read position data from the io stream. - EI_Seek(ioObject, header.offsetVertexPosition); - EI_Read((void*)m_positions.data(), numStrandsInFile * m_numVerticesPerStrand * sizeof(AMD::float4), ioObject); // note that the position data in io stream contains only guide hairs. If we call GenerateFollowHairs + eiSeekResult = EI_Seek(ioObject, header.offsetVertexPosition); + eiReadResult = EI_Read((void*)m_positions.data(), numStrandsInFile * m_numVerticesPerStrand * sizeof(AMD::float4), ioObject); // note that the position data in io stream contains only guide hairs. If we call GenerateFollowHairs // to generate follow hairs, m_positions will be re-allocated. // We need to make up some strands to fill up the buffer because the number of strands from stream is not necessarily multile of thread size. @@ -335,11 +335,11 @@ namespace AMD } // Read strand UVs - EI_Seek(ioObject, header.offsetStrandUV); + eiSeekResult = EI_Seek(ioObject, header.offsetStrandUV); m_strandUV.resize(m_numTotalStrands); // If we call GenerateFollowHairs to generate follow hairs, // m_strandUV will be re-allocated. - EI_Read((void*)m_strandUV.data(), numStrandsInFile * sizeof(AMD::float2), ioObject); + eiReadResult = EI_Read((void*)m_strandUV.data(), numStrandsInFile * sizeof(AMD::float2), ioObject); // Fill up the last empty space AMD::int32 indexLastStrand = (numStrandsInFile - 1); @@ -683,21 +683,21 @@ namespace AMD void TressFXAsset::GetBonesNames(FILE* ioObject, std::vector& boneNames) { AMD::int32 numOfBones = 0; - EI_Seek(ioObject, 0); - EI_Read((void*)&numOfBones, sizeof(AMD::int32), ioObject); + [[maybe_unused]] auto eiSeekResult = EI_Seek(ioObject, 0); + [[maybe_unused]] auto eiReadResult = EI_Read((void*)&numOfBones, sizeof(AMD::int32), ioObject); // boneNames.reserve(numOfBones); boneNames.resize(numOfBones); for (int i = 0; i < numOfBones; i++) { int boneIndex; - EI_Read((char*)&boneIndex, sizeof(AMD::int32), ioObject); + eiReadResult = EI_Read((char*)&boneIndex, sizeof(AMD::int32), ioObject); AMD::int32 charLen = 0; - EI_Read((char*)&charLen, sizeof(AMD::int32), ioObject); // character length includes null termination already. + eiReadResult = EI_Read((char*)&charLen, sizeof(AMD::int32), ioObject); // character length includes null termination already. char boneName[128]; - EI_Read(boneName, sizeof(char) * charLen, ioObject); + eiReadResult = EI_Read(boneName, sizeof(char) * charLen, ioObject); boneName[charLen] = '\0'; // adding 0 termination to be on the safe side. boneNames[i] = std::string(boneName); } @@ -730,8 +730,8 @@ namespace AMD m_boneSkinningData.resize(0); AMD::int32 numOfBones = 0; - EI_Seek(ioObject, 0); - EI_Read((void*)&numOfBones, sizeof(AMD::int32), ioObject); + [[maybe_unused]] auto eiSeekResult = EI_Seek(ioObject, 0); + [[maybe_unused]] auto eiReadResult = EI_Read((void*)&numOfBones, sizeof(AMD::int32), ioObject); if (skeletonBoneIndices.size() != numOfBones) { @@ -742,18 +742,18 @@ namespace AMD for (int i = 0; i < numOfBones; i++) { int boneIndex; - EI_Read((char*)&boneIndex, sizeof(AMD::int32), ioObject); + eiReadResult = EI_Read((char*)&boneIndex, sizeof(AMD::int32), ioObject); AMD::int32 charLen = 0; - EI_Read((char*)&charLen, sizeof(AMD::int32), ioObject); // character length includes null termination already. + eiReadResult = EI_Read((char*)&charLen, sizeof(AMD::int32), ioObject); // character length includes null termination already. char boneName[128]; - EI_Read(boneName, sizeof(char) * charLen, ioObject); + eiReadResult = EI_Read(boneName, sizeof(char) * charLen, ioObject); } // Reading the number of strands AMD::int32 numOfStrandsInStream = 0; - EI_Read((char*)&numOfStrandsInStream, sizeof(AMD::int32), ioObject); + eiReadResult = EI_Read((char*)&numOfStrandsInStream, sizeof(AMD::int32), ioObject); //If the number of strands from the input stream (tfxbone) is bigger than what we already know from tfx, something is wrong. if (m_numGuideStrands < numOfStrandsInStream) @@ -765,15 +765,15 @@ namespace AMD for (int i = 0; i < numOfStrandsInStream; ++i) { AMD::int32 index = 0; // Well, we don't really use this here. - EI_Read((char*)&index, sizeof(AMD::int32), ioObject); + eiReadResult = EI_Read((char*)&index, sizeof(AMD::int32), ioObject); for (AMD::int32 j = 0; j < TRESSFX_MAX_INFLUENTIAL_BONE_COUNT; ++j) { AMD::int32 boneIndex; - EI_Read((char*)&boneIndex, sizeof(AMD::int32), ioObject); + eiReadResult = EI_Read((char*)&boneIndex, sizeof(AMD::int32), ioObject); assert(boneIndex >= 0); skinData.boneIndex[j] = (float)skeletonBoneIndices[boneIndex]; // Change the joint index to be what the engine wants - EI_Read((char*)&skinData.weight[j], sizeof(AMD::real32), ioObject); + eiReadResult = EI_Read((char*)&skinData.weight[j], sizeof(AMD::real32), ioObject); } #if defined(AZ_ENABLE_TRACING) @@ -987,4 +987,3 @@ namespace AMD return true; } } // namespace AMD - diff --git a/Gems/GradientSignal/Code/Source/Components/GradientSurfaceDataComponent.cpp b/Gems/GradientSignal/Code/Source/Components/GradientSurfaceDataComponent.cpp index cd87e3044c..86bcbf2a2d 100644 --- a/Gems/GradientSignal/Code/Source/Components/GradientSurfaceDataComponent.cpp +++ b/Gems/GradientSignal/Code/Source/Components/GradientSurfaceDataComponent.cpp @@ -251,7 +251,7 @@ namespace GradientSignal const float value = m_gradientSampler.GetValue(sampleParams); if (value >= m_configuration.m_thresholdMin && value <= m_configuration.m_thresholdMax) { - weights.AddSurfaceWeightsIfGreater(m_configuration.m_modifierTags, value); + weights.AddSurfaceTagWeights(m_configuration.m_modifierTags, value); } } }); diff --git a/Gems/MotionMatching/Assets/Levels/MotionMatching_AutomaticDemo/CameraController_AutomaticDemo.scriptcanvas b/Gems/MotionMatching/Assets/Levels/MotionMatching_AutomaticDemo/CameraController_AutomaticDemo.scriptcanvas index 8569d7686b..391ad295a5 100644 --- a/Gems/MotionMatching/Assets/Levels/MotionMatching_AutomaticDemo/CameraController_AutomaticDemo.scriptcanvas +++ b/Gems/MotionMatching/Assets/Levels/MotionMatching_AutomaticDemo/CameraController_AutomaticDemo.scriptcanvas @@ -5,7 +5,7 @@ "ClassData": { "m_scriptCanvas": { "Id": { - "id": 1874297699023155003 + "id": 8461866310375259320 }, "Name": "CameraController", "Components": { @@ -579,17 +579,88 @@ }, { "Id": { - "id": 58633135722148 + "id": 214400860662419 + }, + "Name": "SC Node(GetVariable)", + "Components": { + "Component_[1359072869693534631]": { + "$type": "GetVariableNode", + "Id": 1359072869693534631, + "Slots": [ + { + "id": { + "m_id": "{7500DE86-7349-4213-B3D6-F2872EDF15A6}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "toolTip": "When signaled sends the property referenced by this node to a Data Output slot", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{8C8D3DD7-F821-42F4-AF51-5D976133DAE4}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "toolTip": "Signaled after the referenced property has been pushed to the Data Output slot", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{5E4734A2-3CAF-4E29-AC72-5689FF1FD619}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Number", + "DisplayDataType": { + "m_type": 3 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "m_variableId": { + "m_id": "{0620A309-A152-4CF3-BF76-284115B30780}" + }, + "m_variableDataOutSlotId": { + "m_id": "{5E4734A2-3CAF-4E29-AC72-5689FF1FD619}" + } + } + } + }, + { + "Id": { + "id": 58581596114596 }, "Name": "SC-Node(OperatorMul)", "Components": { - "Component_[13427352953117170385]": { + "Component_[14210959117790557692]": { "$type": "OperatorMul", - "Id": 13427352953117170385, + "Id": 14210959117790557692, "Slots": [ { "id": { - "m_id": "{B6D38C30-7BB4-4549-AFFA-C5A52AE9796E}" + "m_id": "{374AA17F-7CC0-4808-8269-6CC4F64579C3}" }, "contracts": [ { @@ -604,7 +675,7 @@ }, { "id": { - "m_id": "{86D20026-0D06-4DFB-B3CD-9BE5038B8121}" + "m_id": "{1E111259-19D2-4180-81A1-F648F79B004D}" }, "contracts": [ { @@ -619,7 +690,7 @@ }, { "id": { - "m_id": "{F9E6233F-EAFB-43F5-A10D-96A3A41763A7}" + "m_id": "{E7D6A002-7522-4915-BCCB-89A29E3D5582}" }, "DynamicTypeOverride": 3, "contracts": [ @@ -648,10 +719,10 @@ ] } ], - "slotName": "Number", + "slotName": "Transform", "toolTip": "An operand to use in performing the specified Operation", "DisplayDataType": { - "m_type": 3 + "m_type": 7 }, "DisplayGroup": { "Value": 1114760223 @@ -667,7 +738,7 @@ }, { "id": { - "m_id": "{9D3D613C-ABE4-4028-A1CC-22E6E036376C}" + "m_id": "{0ABC384E-FBE6-40F8-B5C3-7652B814102C}" }, "DynamicTypeOverride": 3, "contracts": [ @@ -696,10 +767,10 @@ ] } ], - "slotName": "Number", + "slotName": "Transform", "toolTip": "An operand to use in performing the specified Operation", "DisplayDataType": { - "m_type": 3 + "m_type": 7 }, "DisplayGroup": { "Value": 1114760223 @@ -715,7 +786,7 @@ }, { "id": { - "m_id": "{C0EA31C9-71C6-4CCF-A31B-33E7385C78D0}" + "m_id": "{7DA1EC3E-277C-4DDA-94FD-EF2EC66CD272}" }, "DynamicTypeOverride": 3, "contracts": [ @@ -747,7 +818,7 @@ "slotName": "Result", "toolTip": "The result of the specified operation", "DisplayDataType": { - "m_type": 3 + "m_type": 7 }, "DisplayGroup": { "Value": 1114760223 @@ -765,110 +836,65 @@ "Datums": [ { "scriptCanvasType": { - "m_type": 3 + "m_type": 7 }, "isNullPointer": false, - "$type": "double", - "value": 1.0, - "label": "Number" + "$type": "Transform", + "value": { + "Translation": [ + 0.0, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.0, + 1.0 + ], + "Scale": 1.0 + }, + "label": "Transform" }, { "scriptCanvasType": { - "m_type": 3 + "m_type": 7 }, "isNullPointer": false, - "$type": "double", - "value": -90.0, - "label": "Number" - } - ] - } - } - }, - { - "Id": { - "id": 214400860662419 - }, - "Name": "SC Node(GetVariable)", - "Components": { - "Component_[1359072869693534631]": { - "$type": "GetVariableNode", - "Id": 1359072869693534631, - "Slots": [ - { - "id": { - "m_id": "{7500DE86-7349-4213-B3D6-F2872EDF15A6}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "toolTip": "When signaled sends the property referenced by this node to a Data Output slot", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{8C8D3DD7-F821-42F4-AF51-5D976133DAE4}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "toolTip": "Signaled after the referenced property has been pushed to the Data Output slot", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{5E4734A2-3CAF-4E29-AC72-5689FF1FD619}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Number", - "DisplayDataType": { - "m_type": 3 - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 + "$type": "Transform", + "value": { + "Translation": [ + 0.0, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.0, + 1.0 + ], + "Scale": 1.0 }, - "DataType": 1 + "label": "Transform" } - ], - "m_variableId": { - "m_id": "{0620A309-A152-4CF3-BF76-284115B30780}" - }, - "m_variableDataOutSlotId": { - "m_id": "{5E4734A2-3CAF-4E29-AC72-5689FF1FD619}" - } + ] } } }, { "Id": { - "id": 58577301147300 + "id": 213241219492499 }, - "Name": "SC-Node(OperatorMul)", + "Name": "SC-Node(OperatorAdd)", "Components": { - "Component_[14055904483179664364]": { - "$type": "OperatorMul", - "Id": 14055904483179664364, + "Component_[14948826965328970882]": { + "$type": "OperatorAdd", + "Id": 14948826965328970882, "Slots": [ { "id": { - "m_id": "{F5BE2CBC-3CA3-44BD-B7D4-71D9CAC023B3}" + "m_id": "{56805D2B-0C98-4145-80FB-AA1DCB16CF1A}" }, "contracts": [ { @@ -883,7 +909,7 @@ }, { "id": { - "m_id": "{4CD5D25E-73DA-4936-89E9-8F0A7946DED1}" + "m_id": "{008FCEC7-3E86-4249-A736-F158EFDB0EFA}" }, "contracts": [ { @@ -898,7 +924,7 @@ }, { "id": { - "m_id": "{2F0B4FC7-0B48-42A9-8073-8493E9F1D2E5}" + "m_id": "{DB849F77-66D0-4D64-A45F-122F93E1E80C}" }, "DynamicTypeOverride": 3, "contracts": [ @@ -907,7 +933,6 @@ }, { "$type": "MathOperatorContract", - "OperatorType": "Multiply", "NativeTypes": [ { "m_type": 3 @@ -916,7 +941,19 @@ "m_type": 6 }, { - "m_type": 7 + "m_type": 8 + }, + { + "m_type": 9 + }, + { + "m_type": 10 + }, + { + "m_type": 11 + }, + { + "m_type": 12 }, { "m_type": 14 @@ -946,7 +983,7 @@ }, { "id": { - "m_id": "{67B729E8-73F9-4B97-A67C-C986E874BD01}" + "m_id": "{CA8ABF3F-BF80-4A8B-A2B2-A1D2C16278C1}" }, "DynamicTypeOverride": 3, "contracts": [ @@ -955,7 +992,6 @@ }, { "$type": "MathOperatorContract", - "OperatorType": "Multiply", "NativeTypes": [ { "m_type": 3 @@ -964,7 +1000,19 @@ "m_type": 6 }, { - "m_type": 7 + "m_type": 8 + }, + { + "m_type": 9 + }, + { + "m_type": 10 + }, + { + "m_type": 11 + }, + { + "m_type": 12 }, { "m_type": 14 @@ -994,7 +1042,7 @@ }, { "id": { - "m_id": "{785A9BC8-8F65-4DFE-8809-7C8E937A8D8B}" + "m_id": "{53895246-F759-4328-AABB-D26E49E5208D}" }, "DynamicTypeOverride": 3, "contracts": [ @@ -1003,7 +1051,6 @@ }, { "$type": "MathOperatorContract", - "OperatorType": "Multiply", "NativeTypes": [ { "m_type": 3 @@ -1012,414 +1059,10 @@ "m_type": 6 }, { - "m_type": 7 + "m_type": 8 }, { - "m_type": 14 - }, - { - "m_type": 15 - } - ] - } - ], - "slotName": "Result", - "toolTip": "The result of the specified operation", - "DisplayDataType": { - "m_type": 3 - }, - "DisplayGroup": { - "Value": 1114760223 - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DynamicGroup": { - "Value": 1114760223 - }, - "DataType": 1 - } - ], - "Datums": [ - { - "scriptCanvasType": { - "m_type": 3 - }, - "isNullPointer": false, - "$type": "double", - "value": 1.0, - "label": "Number" - }, - { - "scriptCanvasType": { - "m_type": 3 - }, - "isNullPointer": false, - "$type": "double", - "value": 1.0, - "label": "Number" - } - ] - } - } - }, - { - "Id": { - "id": 58581596114596 - }, - "Name": "SC-Node(OperatorMul)", - "Components": { - "Component_[14210959117790557692]": { - "$type": "OperatorMul", - "Id": 14210959117790557692, - "Slots": [ - { - "id": { - "m_id": "{374AA17F-7CC0-4808-8269-6CC4F64579C3}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{1E111259-19D2-4180-81A1-F648F79B004D}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{E7D6A002-7522-4915-BCCB-89A29E3D5582}" - }, - "DynamicTypeOverride": 3, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "MathOperatorContract", - "OperatorType": "Multiply", - "NativeTypes": [ - { - "m_type": 3 - }, - { - "m_type": 6 - }, - { - "m_type": 7 - }, - { - "m_type": 14 - }, - { - "m_type": 15 - } - ] - } - ], - "slotName": "Transform", - "toolTip": "An operand to use in performing the specified Operation", - "DisplayDataType": { - "m_type": 7 - }, - "DisplayGroup": { - "Value": 1114760223 - }, - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DynamicGroup": { - "Value": 1114760223 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{0ABC384E-FBE6-40F8-B5C3-7652B814102C}" - }, - "DynamicTypeOverride": 3, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "MathOperatorContract", - "OperatorType": "Multiply", - "NativeTypes": [ - { - "m_type": 3 - }, - { - "m_type": 6 - }, - { - "m_type": 7 - }, - { - "m_type": 14 - }, - { - "m_type": 15 - } - ] - } - ], - "slotName": "Transform", - "toolTip": "An operand to use in performing the specified Operation", - "DisplayDataType": { - "m_type": 7 - }, - "DisplayGroup": { - "Value": 1114760223 - }, - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DynamicGroup": { - "Value": 1114760223 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{7DA1EC3E-277C-4DDA-94FD-EF2EC66CD272}" - }, - "DynamicTypeOverride": 3, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "MathOperatorContract", - "OperatorType": "Multiply", - "NativeTypes": [ - { - "m_type": 3 - }, - { - "m_type": 6 - }, - { - "m_type": 7 - }, - { - "m_type": 14 - }, - { - "m_type": 15 - } - ] - } - ], - "slotName": "Result", - "toolTip": "The result of the specified operation", - "DisplayDataType": { - "m_type": 7 - }, - "DisplayGroup": { - "Value": 1114760223 - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DynamicGroup": { - "Value": 1114760223 - }, - "DataType": 1 - } - ], - "Datums": [ - { - "scriptCanvasType": { - "m_type": 7 - }, - "isNullPointer": false, - "$type": "Transform", - "value": { - "Translation": [ - 0.0, - 0.0, - 0.0 - ], - "Rotation": [ - 0.0, - 0.0, - 0.0, - 1.0 - ], - "Scale": 1.0 - }, - "label": "Transform" - }, - { - "scriptCanvasType": { - "m_type": 7 - }, - "isNullPointer": false, - "$type": "Transform", - "value": { - "Translation": [ - 0.0, - 0.0, - 0.0 - ], - "Rotation": [ - 0.0, - 0.0, - 0.0, - 1.0 - ], - "Scale": 1.0 - }, - "label": "Transform" - } - ] - } - } - }, - { - "Id": { - "id": 213241219492499 - }, - "Name": "SC-Node(OperatorAdd)", - "Components": { - "Component_[14948826965328970882]": { - "$type": "OperatorAdd", - "Id": 14948826965328970882, - "Slots": [ - { - "id": { - "m_id": "{56805D2B-0C98-4145-80FB-AA1DCB16CF1A}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{008FCEC7-3E86-4249-A736-F158EFDB0EFA}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{DB849F77-66D0-4D64-A45F-122F93E1E80C}" - }, - "DynamicTypeOverride": 3, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "MathOperatorContract", - "NativeTypes": [ - { - "m_type": 3 - }, - { - "m_type": 6 - }, - { - "m_type": 8 - }, - { - "m_type": 9 - }, - { - "m_type": 10 - }, - { - "m_type": 11 - }, - { - "m_type": 12 - }, - { - "m_type": 14 - }, - { - "m_type": 15 - } - ] - } - ], - "slotName": "Number", - "toolTip": "An operand to use in performing the specified Operation", - "DisplayDataType": { - "m_type": 3 - }, - "DisplayGroup": { - "Value": 1114760223 - }, - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DynamicGroup": { - "Value": 1114760223 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{CA8ABF3F-BF80-4A8B-A2B2-A1D2C16278C1}" - }, - "DynamicTypeOverride": 3, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "MathOperatorContract", - "NativeTypes": [ - { - "m_type": 3 - }, - { - "m_type": 6 - }, - { - "m_type": 8 - }, - { - "m_type": 9 + "m_type": 9 }, { "m_type": 10 @@ -1439,8 +1082,8 @@ ] } ], - "slotName": "Number", - "toolTip": "An operand to use in performing the specified Operation", + "slotName": "Result", + "toolTip": "The result of the specified operation", "DisplayDataType": { "m_type": 3 }, @@ -1448,7 +1091,7 @@ "Value": 1114760223 }, "Descriptor": { - "ConnectionType": 1, + "ConnectionType": 2, "SlotType": 2 }, "DynamicGroup": { @@ -1458,7 +1101,7 @@ }, { "id": { - "m_id": "{53895246-F759-4328-AABB-D26E49E5208D}" + "m_id": "{095D00D3-962F-47DD-8400-F025C008E579}" }, "DynamicTypeOverride": 3, "contracts": [ @@ -1498,8 +1141,8 @@ ] } ], - "slotName": "Result", - "toolTip": "The result of the specified operation", + "slotName": "Number", + "toolTip": "An operand to use in performing the specified Operation", "DisplayDataType": { "m_type": 3 }, @@ -1507,7 +1150,7 @@ "Value": 1114760223 }, "Descriptor": { - "ConnectionType": 2, + "ConnectionType": 1, "SlotType": 2 }, "DynamicGroup": { @@ -1534,6 +1177,16 @@ "$type": "double", "value": 0.0, "label": "Number" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 3 + }, + "isNullPointer": false, + "$type": "double", + "value": 0.0, + "label": "Number" } ] } @@ -1582,296 +1235,86 @@ "DataType": 1 }, { - "id": { - "m_id": "{6BB59597-64B4-458F-9C96-B3E0DA73279A}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{44A7845D-724A-4BB6-99F1-12B2E7979D93}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - } - ], - "Datums": [ - { - "scriptCanvasType": { - "m_type": 1 - }, - "isNullPointer": false, - "$type": "EntityId", - "value": { - "id": 2901262558 - }, - "label": "Transform" - }, - { - "scriptCanvasType": { - "m_type": 7 - }, - "isNullPointer": false, - "$type": "Transform", - "value": { - "Translation": [ - 0.0, - 0.0, - 0.0 - ], - "Rotation": [ - 0.0, - 0.0, - 0.0, - 1.0 - ], - "Scale": 1.0 - }, - "label": "Transform: 1" - } - ], - "methodType": 0, - "methodName": "SetWorldTM", - "className": "TransformBus", - "resultSlotIDs": [ - {} - ], - "inputSlots": [ - { - "m_id": "{785CBBEE-E704-4049-A180-8E99E3E1E1F2}" - }, - { - "m_id": "{A7826FF9-C3B2-4E28-815D-9B07A6EE0949}" - } - ], - "prettyClassName": "TransformBus" - } - } - }, - { - "Id": { - "id": 239870016727699 - }, - "Name": "SC-Node(OperatorMul)", - "Components": { - "Component_[3092852928531574536]": { - "$type": "OperatorMul", - "Id": 3092852928531574536, - "Slots": [ - { - "id": { - "m_id": "{FEFF67A1-C89B-447E-80D4-CD94CB0C8AD7}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{7E5D8673-F03A-4134-87DE-88AD13A74C29}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{8A243C9C-0D69-4753-B28B-A8D2FAC5D508}" - }, - "DynamicTypeOverride": 3, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "MathOperatorContract", - "OperatorType": "Multiply", - "NativeTypes": [ - { - "m_type": 3 - }, - { - "m_type": 6 - }, - { - "m_type": 7 - }, - { - "m_type": 14 - }, - { - "m_type": 15 - } - ] - } - ], - "slotName": "Number", - "toolTip": "An operand to use in performing the specified Operation", - "DisplayDataType": { - "m_type": 3 - }, - "DisplayGroup": { - "Value": 1114760223 - }, - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DynamicGroup": { - "Value": 1114760223 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{3F3F3DD6-124E-48A8-8373-6666900D8177}" - }, - "DynamicTypeOverride": 3, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "MathOperatorContract", - "OperatorType": "Multiply", - "NativeTypes": [ - { - "m_type": 3 - }, - { - "m_type": 6 - }, - { - "m_type": 7 - }, - { - "m_type": 14 - }, - { - "m_type": 15 - } - ] - } - ], - "slotName": "Number", - "toolTip": "An operand to use in performing the specified Operation", - "DisplayDataType": { - "m_type": 3 - }, - "DisplayGroup": { - "Value": 1114760223 - }, - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DynamicGroup": { - "Value": 1114760223 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{DFD1DE7E-B470-43F6-A6CF-E9E572D0C075}" - }, - "DynamicTypeOverride": 3, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "MathOperatorContract", - "OperatorType": "Multiply", - "NativeTypes": [ - { - "m_type": 3 - }, - { - "m_type": 6 - }, - { - "m_type": 7 - }, - { - "m_type": 14 - }, - { - "m_type": 15 - } - ] + "id": { + "m_id": "{6BB59597-64B4-458F-9C96-B3E0DA73279A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" } ], - "slotName": "Result", - "toolTip": "The result of the specified operation", - "DisplayDataType": { - "m_type": 3 - }, - "DisplayGroup": { - "Value": 1114760223 + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{44A7845D-724A-4BB6-99F1-12B2E7979D93}" }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", "Descriptor": { "ConnectionType": 2, - "SlotType": 2 - }, - "DynamicGroup": { - "Value": 1114760223 - }, - "DataType": 1 + "SlotType": 1 + } } ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { - "m_type": 3 + "m_type": 1 }, "isNullPointer": false, - "$type": "double", - "value": 1.0, - "label": "Number" + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "Transform" }, { - "isOverloadedStorage": false, "scriptCanvasType": { - "m_type": 3 + "m_type": 7 }, "isNullPointer": false, - "$type": "double", - "value": 10.0, - "label": "Number" + "$type": "Transform", + "value": { + "Translation": [ + 0.0, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.0, + 1.0 + ], + "Scale": 1.0 + }, + "label": "Transform: 1" } - ] + ], + "methodType": 0, + "methodName": "SetWorldTM", + "className": "TransformBus", + "resultSlotIDs": [ + {} + ], + "inputSlots": [ + { + "m_id": "{785CBBEE-E704-4049-A180-8E99E3E1E1F2}" + }, + { + "m_id": "{A7826FF9-C3B2-4E28-815D-9B07A6EE0949}" + } + ], + "prettyClassName": "TransformBus" } } }, @@ -2227,33 +1670,243 @@ "$type": "SlotTypeContract" } ], - "slotName": "Result: Transform", + "slotName": "Result: Transform", + "DisplayDataType": { + "m_type": 7 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 8 + }, + "isNullPointer": false, + "$type": "Vector3", + "value": [ + 0.0, + 0.0, + 0.0 + ], + "label": "Vector3: Translation" + } + ], + "Initialized": true + } + } + }, + { + "Id": { + "id": 34623617265138 + }, + "Name": "SC-Node(OperatorMul)", + "Components": { + "Component_[6682944070117268251]": { + "$type": "OperatorMul", + "Id": 6682944070117268251, + "Slots": [ + { + "id": { + "m_id": "{E55CADF9-9769-43D3-B6BD-8EFA828C5B7B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{00F5960A-A85F-4B88-A562-BB6E7BFCE05E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{FB35B335-EA81-45FF-A0BA-CED33329EB93}" + }, + "DynamicTypeOverride": 3, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "MathOperatorContract", + "OperatorType": "Multiply", + "NativeTypes": [ + { + "m_type": 3 + }, + { + "m_type": 6 + }, + { + "m_type": 7 + }, + { + "m_type": 14 + }, + { + "m_type": 15 + } + ] + } + ], + "slotName": "Number", + "toolTip": "An operand to use in performing the specified Operation", + "DisplayDataType": { + "m_type": 3 + }, + "DisplayGroup": { + "Value": 1114760223 + }, + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DynamicGroup": { + "Value": 1114760223 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{85824692-0B8B-4400-87BC-9D8CA6127A88}" + }, + "DynamicTypeOverride": 3, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "MathOperatorContract", + "OperatorType": "Multiply", + "NativeTypes": [ + { + "m_type": 3 + }, + { + "m_type": 6 + }, + { + "m_type": 7 + }, + { + "m_type": 14 + }, + { + "m_type": 15 + } + ] + } + ], + "slotName": "Number", + "toolTip": "An operand to use in performing the specified Operation", + "DisplayDataType": { + "m_type": 3 + }, + "DisplayGroup": { + "Value": 1114760223 + }, + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DynamicGroup": { + "Value": 1114760223 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{84852FBC-F135-48B2-B5C8-AFF3B1F35E42}" + }, + "DynamicTypeOverride": 3, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "MathOperatorContract", + "OperatorType": "Multiply", + "NativeTypes": [ + { + "m_type": 3 + }, + { + "m_type": 6 + }, + { + "m_type": 7 + }, + { + "m_type": 14 + }, + { + "m_type": 15 + } + ] + } + ], + "slotName": "Result", + "toolTip": "The result of the specified operation", "DisplayDataType": { - "m_type": 7 + "m_type": 3 + }, + "DisplayGroup": { + "Value": 1114760223 }, "Descriptor": { "ConnectionType": 2, "SlotType": 2 }, + "DynamicGroup": { + "Value": 1114760223 + }, "DataType": 1 } ], "Datums": [ { + "isOverloadedStorage": false, "scriptCanvasType": { - "m_type": 8 + "m_type": 3 }, "isNullPointer": false, - "$type": "Vector3", - "value": [ - 0.0, - 0.0, - 0.0 - ], - "label": "Vector3: Translation" + "$type": "double", + "value": 1.0, + "label": "Number" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 3 + }, + "isNullPointer": false, + "$type": "double", + "value": 12.5, + "label": "Number" } - ], - "Initialized": true + ] } } }, @@ -2361,77 +2014,6 @@ } } }, - { - "Id": { - "id": 58594481016484 - }, - "Name": "SC Node(GetVariable)", - "Components": { - "Component_[8136131668650391163]": { - "$type": "GetVariableNode", - "Id": 8136131668650391163, - "Slots": [ - { - "id": { - "m_id": "{09256706-E7A2-47C3-ACE0-3BE7D80E34FD}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "toolTip": "When signaled sends the property referenced by this node to a Data Output slot", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{1ACC7F53-E81A-4721-9AC8-5C1A33C8BE96}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "toolTip": "Signaled after the referenced property has been pushed to the Data Output slot", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{4972DD3B-D554-47B7-816B-CBCF67697ABA}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Number", - "DisplayDataType": { - "m_type": 3 - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DataType": 1 - } - ], - "m_variableId": { - "m_id": "{0620A309-A152-4CF3-BF76-284115B30780}" - }, - "m_variableDataOutSlotId": { - "m_id": "{4972DD3B-D554-47B7-816B-CBCF67697ABA}" - } - } - } - }, { "Id": { "id": 58658905525924 @@ -2668,62 +2250,6 @@ } ], "m_connections": [ - { - "Id": { - "id": 58706150166180 - }, - "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(RotationZDegrees: In)", - "Components": { - "Component_[553961487450147653]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 553961487450147653, - "sourceEndpoint": { - "nodeId": { - "id": 58594481016484 - }, - "slotId": { - "m_id": "{1ACC7F53-E81A-4721-9AC8-5C1A33C8BE96}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 58590186049188 - }, - "slotId": { - "m_id": "{4B28D8A2-7F6C-4EB1-A7D5-EA68FB783B52}" - } - } - } - } - }, - { - "Id": { - "id": 58710445133476 - }, - "Name": "srcEndpoint=(Get Variable: Number), destEndpoint=(RotationZDegrees: Number: Degrees)", - "Components": { - "Component_[8946072267986857913]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 8946072267986857913, - "sourceEndpoint": { - "nodeId": { - "id": 58594481016484 - }, - "slotId": { - "m_id": "{4972DD3B-D554-47B7-816B-CBCF67697ABA}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 58590186049188 - }, - "slotId": { - "m_id": "{694A218A-8047-4981-BF62-726AF9BCB3C6}" - } - } - } - } - }, { "Id": { "id": 58714740100772 @@ -2883,122 +2409,10 @@ }, "targetEndpoint": { "nodeId": { - "id": 58581596114596 - }, - "slotId": { - "m_id": "{374AA17F-7CC0-4808-8269-6CC4F64579C3}" - } - } - } - } - }, - { - "Id": { - "id": 58740509904548 - }, - "Name": "srcEndpoint=(Multiply (*): Result), destEndpoint=(Multiply (*): Transform)", - "Components": { - "Component_[7007808555566524915]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 7007808555566524915, - "sourceEndpoint": { - "nodeId": { - "id": 58624545787556 - }, - "slotId": { - "m_id": "{96271AD4-A2BB-4597-B78F-8053F0200C3D}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 58581596114596 - }, - "slotId": { - "m_id": "{E7D6A002-7522-4915-BCCB-89A29E3D5582}" - } - } - } - } - }, - { - "Id": { - "id": 58753394806436 - }, - "Name": "srcEndpoint=(TickBus Handler: Number), destEndpoint=(Multiply (*): Value)", - "Components": { - "Component_[1087668963814879388]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 1087668963814879388, - "sourceEndpoint": { - "nodeId": { - "id": 58667495460516 - }, - "slotId": { - "m_id": "{02148868-388F-44F0-9E3A-C31601701F3B}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 58577301147300 - }, - "slotId": { - "m_id": "{67B729E8-73F9-4B97-A67C-C986E874BD01}" - } - } - } - } - }, - { - "Id": { - "id": 58783459577508 - }, - "Name": "srcEndpoint=(Set Variable: Out), destEndpoint=(Get Variable: In)", - "Components": { - "Component_[5808096905671825435]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 5808096905671825435, - "sourceEndpoint": { - "nodeId": { - "id": 58654610558628 - }, - "slotId": { - "m_id": "{47175A2C-5EE4-4C48-8CC1-8F2C84D36FE5}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 58594481016484 - }, - "slotId": { - "m_id": "{09256706-E7A2-47C3-ACE0-3BE7D80E34FD}" - } - } - } - } - }, - { - "Id": { - "id": 58787754544804 - }, - "Name": "srcEndpoint=(Multiply (*): Result), destEndpoint=(Multiply (*): Value)", - "Components": { - "Component_[11775794502882233004]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 11775794502882233004, - "sourceEndpoint": { - "nodeId": { - "id": 58577301147300 - }, - "slotId": { - "m_id": "{785A9BC8-8F65-4DFE-8809-7C8E937A8D8B}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 58633135722148 + "id": 58581596114596 }, "slotId": { - "m_id": "{F9E6233F-EAFB-43F5-A10D-96A3A41763A7}" + "m_id": "{374AA17F-7CC0-4808-8269-6CC4F64579C3}" } } } @@ -3006,27 +2420,27 @@ }, { "Id": { - "id": 58792049512100 + "id": 58740509904548 }, - "Name": "srcEndpoint=(Multiply (*): Out), destEndpoint=(Multiply (*): In)", + "Name": "srcEndpoint=(Multiply (*): Result), destEndpoint=(Multiply (*): Transform)", "Components": { - "Component_[80299809090156725]": { + "Component_[7007808555566524915]": { "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 80299809090156725, + "Id": 7007808555566524915, "sourceEndpoint": { "nodeId": { - "id": 58577301147300 + "id": 58624545787556 }, "slotId": { - "m_id": "{4CD5D25E-73DA-4936-89E9-8F0A7946DED1}" + "m_id": "{96271AD4-A2BB-4597-B78F-8053F0200C3D}" } }, "targetEndpoint": { "nodeId": { - "id": 58633135722148 + "id": 58581596114596 }, "slotId": { - "m_id": "{B6D38C30-7BB4-4549-AFFA-C5A52AE9796E}" + "m_id": "{E7D6A002-7522-4915-BCCB-89A29E3D5582}" } } } @@ -3284,34 +2698,6 @@ } } }, - { - "Id": { - "id": 164626484669075 - }, - "Name": "srcEndpoint=(: ), destEndpoint=(: )", - "Components": { - "Component_[14524450253664706586]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 14524450253664706586, - "sourceEndpoint": { - "nodeId": { - "id": 58667495460516 - }, - "slotId": { - "m_id": "{8965578E-A29D-4468-B12B-9D4E4F814641}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 58577301147300 - }, - "slotId": { - "m_id": "{F5BE2CBC-3CA3-44BD-B7D4-71D9CAC023B3}" - } - } - } - } - }, { "Id": { "id": 214778817784467 @@ -3426,27 +2812,27 @@ }, { "Id": { - "id": 240698945415827 + "id": 71140482223643 }, - "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(Multiply (*): In)", + "Name": "srcEndpoint=(Set Variable: Out), destEndpoint=(RotationZDegrees: In)", "Components": { - "Component_[12012899230680400379]": { + "Component_[11167812872648006272]": { "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 12012899230680400379, + "Id": 11167812872648006272, "sourceEndpoint": { "nodeId": { - "id": 214400860662419 + "id": 58654610558628 }, "slotId": { - "m_id": "{8C8D3DD7-F821-42F4-AF51-5D976133DAE4}" + "m_id": "{47175A2C-5EE4-4C48-8CC1-8F2C84D36FE5}" } }, "targetEndpoint": { "nodeId": { - "id": 239870016727699 + "id": 58590186049188 }, "slotId": { - "m_id": "{FEFF67A1-C89B-447E-80D4-CD94CB0C8AD7}" + "m_id": "{4B28D8A2-7F6C-4EB1-A7D5-EA68FB783B52}" } } } @@ -3454,27 +2840,55 @@ }, { "Id": { - "id": 241158506916499 + "id": 71557094051355 }, - "Name": "srcEndpoint=(TickBus Handler: Number), destEndpoint=(Multiply (*): Value)", + "Name": "srcEndpoint=(Set Variable: Number), destEndpoint=(RotationZDegrees: Number: Degrees)", "Components": { - "Component_[6729356013537587652]": { + "Component_[13278183946958091954]": { "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 6729356013537587652, + "Id": 13278183946958091954, "sourceEndpoint": { "nodeId": { - "id": 58667495460516 + "id": 58654610558628 }, "slotId": { - "m_id": "{02148868-388F-44F0-9E3A-C31601701F3B}" + "m_id": "{1B58C71B-3AB9-4D90-A8D5-164A20B083DA}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 58590186049188 + }, + "slotId": { + "m_id": "{694A218A-8047-4981-BF62-726AF9BCB3C6}" + } + } + } + } + }, + { + "Id": { + "id": 35443956018674 + }, + "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(Multiply (*): In)", + "Components": { + "Component_[1036318540886899366]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 1036318540886899366, + "sourceEndpoint": { + "nodeId": { + "id": 214400860662419 + }, + "slotId": { + "m_id": "{8C8D3DD7-F821-42F4-AF51-5D976133DAE4}" } }, "targetEndpoint": { "nodeId": { - "id": 239870016727699 + "id": 34623617265138 }, "slotId": { - "m_id": "{8A243C9C-0D69-4753-B28B-A8D2FAC5D508}" + "m_id": "{E55CADF9-9769-43D3-B6BD-8EFA828C5B7B}" } } } @@ -3482,19 +2896,19 @@ }, { "Id": { - "id": 241845701683859 + "id": 36113970916850 }, "Name": "srcEndpoint=(Multiply (*): Out), destEndpoint=(Add (+): In)", "Components": { - "Component_[1977054835666987502]": { + "Component_[14283307370513044941]": { "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 1977054835666987502, + "Id": 14283307370513044941, "sourceEndpoint": { "nodeId": { - "id": 239870016727699 + "id": 34623617265138 }, "slotId": { - "m_id": "{7E5D8673-F03A-4134-87DE-88AD13A74C29}" + "m_id": "{00F5960A-A85F-4B88-A562-BB6E7BFCE05E}" } }, "targetEndpoint": { @@ -3510,19 +2924,19 @@ }, { "Id": { - "id": 242150644361875 + "id": 36401733725682 }, "Name": "srcEndpoint=(Multiply (*): Result), destEndpoint=(Add (+): Number)", "Components": { - "Component_[4687422202712804034]": { + "Component_[5424678033357045019]": { "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 4687422202712804034, + "Id": 5424678033357045019, "sourceEndpoint": { "nodeId": { - "id": 239870016727699 + "id": 34623617265138 }, "slotId": { - "m_id": "{DFD1DE7E-B470-43F6-A6CF-E9E572D0C075}" + "m_id": "{84852FBC-F135-48B2-B5C8-AFF3B1F35E42}" } }, "targetEndpoint": { @@ -3535,6 +2949,34 @@ } } } + }, + { + "Id": { + "id": 37033093918194 + }, + "Name": "srcEndpoint=(TickBus Handler: Number), destEndpoint=(Multiply (*): Number)", + "Components": { + "Component_[7944449722082928320]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 7944449722082928320, + "sourceEndpoint": { + "nodeId": { + "id": 58667495460516 + }, + "slotId": { + "m_id": "{02148868-388F-44F0-9E3A-C31601701F3B}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 34623617265138 + }, + "slotId": { + "m_id": "{FB35B335-EA81-45FF-A0BA-CED33329EB93}" + } + } + } + } } ] }, @@ -3548,7 +2990,7 @@ "GraphCanvasData": [ { "Key": { - "id": 58577301147300 + "id": 34623617265138 }, "Value": { "ComponentData": { @@ -3562,8 +3004,8 @@ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { "$type": "GeometrySaveData", "Position": [ - -40.0, - 180.0 + 440.0, + 300.0 ] }, "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { @@ -3571,7 +3013,7 @@ }, "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { "$type": "PersistentIdComponentSaveData", - "PersistentId": "{EB1D5C50-BE43-4D5B-95CA-72BB2444355C}" + "PersistentId": "{D071B475-12EA-47E9-9D36-3FF719DFDF55}" } } } @@ -3636,37 +3078,6 @@ } } }, - { - "Key": { - "id": 58594481016484 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "GetVariableNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1820.0, - 160.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".getVariable" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{4F7B87C1-4C5D-4B00-87F1-E742C7F9B0BB}" - } - } - } - }, { "Key": { "id": 58607365918372 @@ -3758,36 +3169,6 @@ } } }, - { - "Key": { - "id": 58633135722148 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MathNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 300.0, - 180.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{3B2FC30A-C96E-4D45-8FB8-D93213E40656}" - } - } - } - }, { "Key": { "id": 58654610558628 @@ -3804,8 +3185,8 @@ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { "$type": "GeometrySaveData", "Position": [ - 1300.0, - 480.0 + 1120.0, + 160.0 ] }, "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { @@ -3892,8 +3273,8 @@ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { "$type": "GeometrySaveData", "Position": [ - -480.0, - 500.0 + -420.0, + 180.0 ] }, "{9E81C95F-89C0-4476-8E82-63CCC4E52E04}": { @@ -3990,8 +3371,8 @@ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { "$type": "GeometrySaveData", "Position": [ - 940.0, - 520.0 + 800.0, + 160.0 ] }, "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { @@ -4020,8 +3401,8 @@ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { "$type": "GeometrySaveData", "Position": [ - 100.0, - 540.0 + 60.0, + 160.0 ] }, "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { @@ -4037,46 +3418,15 @@ }, { "Key": { - "id": 239870016727699 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MathNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 480.0, - 700.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{591ECD3E-51E5-4452-B8F0-91EEC22334EC}" - } - } - } - }, - { - "Key": { - "id": 1874297699023155003 + "id": 8461866310375259320 }, "Value": { "ComponentData": { "{5F84B500-8C45-40D1-8EFC-A5306B241444}": { "$type": "SceneComponentSaveData", "ViewParams": { - "Scale": 0.6141249999999999, - "AnchorX": -615.5098876953125, - "AnchorY": -29.309993743896484 + "AnchorX": -166.0, + "AnchorY": 51.0 } } } @@ -4095,11 +3445,11 @@ }, { "Key": 11545666372999204726, - "Value": 2 + "Value": 1 }, { "Key": 12702286953450386850, - "Value": 6 + "Value": 4 }, { "Key": 12777283451032324504, @@ -4151,103 +3501,9 @@ }, "VariableName": "RotateCamZ" } - }, - { - "Key": { - "m_id": "{6A2D4F20-5402-4283-8799-EB8DEABD6369}" - }, - "Value": { - "Datum": { - "scriptCanvasType": { - "m_type": 3 - }, - "isNullPointer": false, - "$type": "double", - "value": 0.1 - }, - "VariableId": { - "m_id": "{6A2D4F20-5402-4283-8799-EB8DEABD6369}" - }, - "VariableName": "JoystickDeadzone" - } - }, - { - "Key": { - "m_id": "{7062B1EE-2A8A-4E1D-8275-9DA1C5927FF0}" - }, - "Value": { - "Datum": { - "scriptCanvasType": { - "m_type": 3 - }, - "isNullPointer": false, - "$type": "double", - "value": 0.0 - }, - "VariableId": { - "m_id": "{7062B1EE-2A8A-4E1D-8275-9DA1C5927FF0}" - }, - "VariableName": "JoystickRight_X" - } - }, - { - "Key": { - "m_id": "{8E040B94-3374-4228-8020-577BB7C70EE7}" - }, - "Value": { - "Datum": { - "scriptCanvasType": { - "m_type": 3 - }, - "isNullPointer": false, - "$type": "double", - "value": 0.0 - }, - "VariableId": { - "m_id": "{8E040B94-3374-4228-8020-577BB7C70EE7}" - }, - "VariableName": "MoveX" - } - }, - { - "Key": { - "m_id": "{BF2919BD-19B4-4738-AC3A-81857D5204E4}" - }, - "Value": { - "Datum": { - "scriptCanvasType": { - "m_type": 3 - }, - "isNullPointer": false, - "$type": "double", - "value": 0.0 - }, - "VariableId": { - "m_id": "{BF2919BD-19B4-4738-AC3A-81857D5204E4}" - }, - "VariableName": "MoveY" - } } ] - }, - "CopiedVariableRemapping": [ - { - "Key": { - "m_id": "{5EB17E58-0B4E-451D-A1CE-0E7C272CBDEC}" - }, - "Value": { - "m_id": "{BF2919BD-19B4-4738-AC3A-81857D5204E4}" - } - }, - { - "Key": { - "m_id": "{B48E5726-A7FF-42A8-84D2-CF43ABBD1EDC}" - }, - "Value": { - "m_id": "{8E040B94-3374-4228-8020-577BB7C70EE7}" - } - } - ] + } } } } diff --git a/Gems/MotionMatching/Assets/MotionMatching.animgraph b/Gems/MotionMatching/Assets/MotionMatching.animgraph deleted file mode 100644 index e5656a3d05..0000000000 --- a/Gems/MotionMatching/Assets/MotionMatching.animgraph +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f974fa29f3542311ee6a4b6fbb92047186c3124b3bd6f88b728646bf9d686c45 -size 39099 diff --git a/Gems/MotionMatching/Code/CMakeLists.txt b/Gems/MotionMatching/Code/CMakeLists.txt index 275f8f2530..ae613f5d7f 100644 --- a/Gems/MotionMatching/Code/CMakeLists.txt +++ b/Gems/MotionMatching/Code/CMakeLists.txt @@ -99,57 +99,49 @@ endif() ################################################################################ # See if globally, tests are supported if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) - # We globally support tests, see if we support tests on this platform for MotionMatching.Static - if(PAL_TRAIT_MOTIONMATCHING_TEST_SUPPORTED) - # We support MotionMatching.Tests on this platform, add MotionMatching.Tests target which depends on MotionMatching.Static - ly_add_target( - NAME MotionMatching.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} - NAMESPACE Gem - FILES_CMAKE - motionmatching_files.cmake - motionmatching_tests_files.cmake - INCLUDE_DIRECTORIES - PRIVATE - Tests - Source - BUILD_DEPENDENCIES - PRIVATE - AZ::AzTest - AZ::AzFramework - Gem::EMotionFX.Tests.Static - Gem::MotionMatching.Static - ) + ly_add_target( + NAME MotionMatching.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} + NAMESPACE Gem + FILES_CMAKE + motionmatching_files.cmake + motionmatching_tests_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + Tests + Source + BUILD_DEPENDENCIES + PRIVATE + AZ::AzTest + AZ::AzFramework + Gem::EMotionFX.Tests.Static + Gem::MotionMatching.Static + ) - # Add MotionMatching.Tests to googletest - ly_add_googletest( - NAME Gem::MotionMatching.Tests - ) - endif() + # Add MotionMatching.Tests to googletest + ly_add_googletest( + NAME Gem::MotionMatching.Tests + ) +endif() - # If we are a host platform we want to add tools test like editor tests here - if(PAL_TRAIT_BUILD_HOST_TOOLS) - # We are a host platform, see if Editor tests are supported on this platform - if(PAL_TRAIT_MOTIONMATCHING_EDITOR_TEST_SUPPORTED) - # We support MotionMatching.Editor.Tests on this platform, add MotionMatching.Editor.Tests target which depends on MotionMatching.Editor - ly_add_target( - NAME MotionMatching.Editor.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} - NAMESPACE Gem - FILES_CMAKE - motionmatching_editor_tests_files.cmake - INCLUDE_DIRECTORIES - PRIVATE - Tests - Source - BUILD_DEPENDENCIES - PRIVATE - AZ::AzTest - Gem::MotionMatching.Editor - ) +# If we are a host platform we want to add tools test like editor tests here +if(PAL_TRAIT_BUILD_HOST_TOOLS) + ly_add_target( + NAME MotionMatching.Editor.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} + NAMESPACE Gem + FILES_CMAKE + motionmatching_editor_tests_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + Tests + Source + BUILD_DEPENDENCIES + PRIVATE + AZ::AzTest + Gem::MotionMatching.Editor + ) - # Add MotionMatching.Editor.Tests to googletest - ly_add_googletest( - NAME Gem::MotionMatching.Editor.Tests - ) - endif() - endif() + # Add MotionMatching.Editor.Tests to googletest + ly_add_googletest( + NAME Gem::MotionMatching.Editor.Tests + ) endif() diff --git a/Gems/MotionMatching/Code/Include/MotionMatching/MotionMatchingBus.h b/Gems/MotionMatching/Code/Include/MotionMatching/MotionMatchingBus.h index 5b2bc1847a..dbf38e802b 100644 --- a/Gems/MotionMatching/Code/Include/MotionMatching/MotionMatchingBus.h +++ b/Gems/MotionMatching/Code/Include/MotionMatching/MotionMatchingBus.h @@ -11,8 +11,20 @@ #include #include +#include + namespace EMotionFX::MotionMatching { + class DebugDrawRequests + : public AZ::EBusTraits + { + public: + AZ_RTTI(DebugDrawRequests, "{7BBA4249-EC00-445C-8A0C-4472841049C3}"); + + virtual void DebugDraw(AzFramework::DebugDisplayRequests& debugDisplay) = 0; + }; + using DebugDrawRequestBus = AZ::EBus; + class MotionMatchingRequests { public: diff --git a/Gems/MotionMatching/Code/Source/BlendTreeMotionMatchNode.cpp b/Gems/MotionMatching/Code/Source/BlendTreeMotionMatchNode.cpp index 6661233b66..1546be4669 100644 --- a/Gems/MotionMatching/Code/Source/BlendTreeMotionMatchNode.cpp +++ b/Gems/MotionMatching/Code/Source/BlendTreeMotionMatchNode.cpp @@ -297,8 +297,6 @@ namespace EMotionFX::MotionMatching ImGuiMonitorRequestBus::Broadcast(&ImGuiMonitorRequests::PushPerformanceHistogramValue, "Output", m_outputTimeInMs); #endif } - - instance->DebugDraw(); } AZ::Crc32 BlendTreeMotionMatchNode::GetTrajectoryPathSettingsVisibility() const diff --git a/Gems/MotionMatching/Code/Source/ImGuiMonitor.cpp b/Gems/MotionMatching/Code/Source/ImGuiMonitor.cpp index 97b666c693..158a4b0d23 100644 --- a/Gems/MotionMatching/Code/Source/ImGuiMonitor.cpp +++ b/Gems/MotionMatching/Code/Source/ImGuiMonitor.cpp @@ -16,10 +16,11 @@ namespace EMotionFX::MotionMatching ImGuiMonitor::ImGuiMonitor() { - m_performanceStats.m_name = "Performance Statistics"; + m_performanceStats.SetName("Performance Statistics"); + m_performanceStats.SetHistogramBinCount(500); - m_featureCosts.m_name = "Feature Costs"; - m_featureCosts.m_histogramContainerCount = 100; + m_featureCosts.SetName("Feature Costs"); + m_featureCosts.SetHistogramBinCount(100); ImGui::ImGuiUpdateListenerBus::Handler::BusConnect(); ImGuiMonitorRequestBus::Handler::BusConnect(); @@ -40,18 +41,40 @@ namespace EMotionFX::MotionMatching if (ImGui::Begin("Motion Matching")) { + if (ImGui::CollapsingHeader("Motion Database", ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_Framed)) + { + if (ImGui::BeginTable("MDB", 2)) + { + ImGui::TableNextColumn(); ImGui::Text("Memory Usage: %.2f MB", m_frameDatabaseInfo.m_memoryUsedInBytes / 1024.0f / 1024.0f); + ImGui::TableNextColumn(); ImGui::Text("Motion Data: %.0f minutes", m_frameDatabaseInfo.m_motionDataInSeconds / 60.0f); + ImGui::TableNextColumn(); ImGui::Text("Num Frames: %zu", m_frameDatabaseInfo.m_numFrames); + ImGui::TableNextColumn(); ImGui::Text("Num Motions: %zu", m_frameDatabaseInfo.m_numMotions); + ImGui::EndTable(); + } + } + if (ImGui::CollapsingHeader("Feature Matrix", ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_Framed)) { - ImGui::Text("Memory Usage: %.2f MB", m_featureMatrixMemoryUsageInBytes / 1024.0f / 1024.0f); - ImGui::Text("Num Frames: %zu", m_featureMatrixNumFrames); - ImGui::Text("Num Feature Components: %zu", m_featureMatrixNumComponents); + if (ImGui::BeginTable("FM", 2)) + { + ImGui::TableNextColumn(); ImGui::Text("Memory Usage: %.2f MB", m_featurMatrixInfo.m_memoryUsedInBytes / 1024.0f / 1024.0f); + ImGui::TableNextColumn(); + ImGui::TableNextColumn(); ImGui::Text("Num Frames: %zu", m_featurMatrixInfo.m_numFrames); + ImGui::TableNextColumn(); ImGui::Text("Num Feature Components: %zu", m_featurMatrixInfo.m_numDimensions); + ImGui::EndTable(); + } } if (ImGui::CollapsingHeader("Kd-Tree", ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_Framed)) { - ImGui::Text("Memory Usage: %.2f MB", m_kdTreeMemoryUsageInBytes / 1024.0f / 1024.0f); - ImGui::Text("Num Nodes: %zu", m_kdTreeNumNodes); - ImGui::Text("Num Dimensions: %zu", m_kdTreeNumDimensions); + if (ImGui::BeginTable("KDT", 2)) + { + ImGui::TableNextColumn(); ImGui::Text("Memory Usage: %.2f MB", m_kdTreeInfo.m_memoryUsedInBytes / 1024.0f / 1024.0f); + ImGui::TableNextColumn(); + ImGui::TableNextColumn(); ImGui::Text("Num Nodes: %zu", m_kdTreeInfo.m_numNodes); + ImGui::TableNextColumn(); ImGui::Text("Num Dimensions: %zu", m_kdTreeInfo.m_numDimensions); + ImGui::EndTable(); + } } m_performanceStats.OnImGuiUpdate(); @@ -63,8 +86,8 @@ namespace EMotionFX::MotionMatching { if (ImGui::BeginMenu("Motion Matching")) { - ImGui::MenuItem(m_performanceStats.m_name.c_str(), "", &m_performanceStats.m_show); - ImGui::MenuItem(m_featureCosts.m_name.c_str(), "", &m_featureCosts.m_show); + ImGui::MenuItem(m_performanceStats.GetName(), "", &m_performanceStats.m_show); + ImGui::MenuItem(m_featureCosts.GetName(), "", &m_featureCosts.m_show); ImGui::EndMenu(); } } @@ -78,67 +101,6 @@ namespace EMotionFX::MotionMatching { m_featureCosts.PushHistogramValue(costName, value, color); } - - void ImGuiMonitor::HistogramGroup::PushHistogramValue(const char* valueName, float value, const AZ::Color& color) - { - auto iterator = m_histogramIndexByName.find(valueName); - if (iterator != m_histogramIndexByName.end()) - { - ImGui::LYImGuiUtils::HistogramContainer& histogramContiner = m_histograms[iterator->second]; - histogramContiner.PushValue(value); - histogramContiner.SetBarLineColor(ImColor(color.GetR(), color.GetG(), color.GetB(), color.GetA())); - } - else - { - ImGui::LYImGuiUtils::HistogramContainer newHistogram; - newHistogram.Init(/*histogramName=*/valueName, - /*containerCount=*/m_histogramContainerCount, - /*viewType=*/ImGui::LYImGuiUtils::HistogramContainer::ViewType::Histogram, - /*displayOverlays=*/true, - /*min=*/0.0f, - /*max=*/0.0f); - - newHistogram.SetMoveDirection(ImGui::LYImGuiUtils::HistogramContainer::PushRightMoveLeft); - newHistogram.PushValue(value); - - m_histogramIndexByName[valueName] = m_histograms.size(); - m_histograms.push_back(newHistogram); - } - } - - void ImGuiMonitor::HistogramGroup::OnImGuiUpdate() - { - if (!m_show) - { - return; - } - - if (ImGui::CollapsingHeader(m_name.c_str(), ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_Framed)) - { - for (auto& histogram : m_histograms) - { - ImGui::BeginGroup(); - { - histogram.Draw(ImGui::GetColumnWidth() - 70, s_histogramHeight); - - ImGui::SameLine(); - - ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(0,0,0,255)); - { - const ImColor color = histogram.GetBarLineColor(); - ImGui::PushStyleColor(ImGuiCol_Button, color.Value); - { - const AZStd::string valueString = AZStd::string::format("%.2f", histogram.GetLastValue()); - ImGui::Button(valueString.c_str()); - } - ImGui::PopStyleColor(); - } - ImGui::PopStyleColor(); - } - ImGui::EndGroup(); - } - } - } } // namespace EMotionFX::MotionMatching #endif // IMGUI_ENABLED diff --git a/Gems/MotionMatching/Code/Source/ImGuiMonitor.h b/Gems/MotionMatching/Code/Source/ImGuiMonitor.h index 0583d0ba41..a2af477987 100644 --- a/Gems/MotionMatching/Code/Source/ImGuiMonitor.h +++ b/Gems/MotionMatching/Code/Source/ImGuiMonitor.h @@ -20,7 +20,7 @@ #include #include #include -#include +#include namespace EMotionFX::MotionMatching { @@ -43,41 +43,17 @@ namespace EMotionFX::MotionMatching void PushPerformanceHistogramValue(const char* performanceMetricName, float value) override; void PushCostHistogramValue(const char* costName, float value, const AZ::Color& color) override; - void SetFeatureMatrixMemoryUsage(size_t sizeInBytes) override { m_featureMatrixMemoryUsageInBytes = sizeInBytes; } - void SetFeatureMatrixNumFrames(size_t numFrames) override { m_featureMatrixNumFrames = numFrames; } - void SetFeatureMatrixNumComponents(size_t numFeatureComponents) override { m_featureMatrixNumComponents = numFeatureComponents; } - - void SetKdTreeMemoryUsage(size_t sizeInBytes) override { m_kdTreeMemoryUsageInBytes = sizeInBytes; } - void SetKdTreeNumNodes(size_t numNodes) override { m_kdTreeNumNodes = numNodes; } - void SetKdTreeNumDimensions(size_t numDimensions) override { m_kdTreeNumDimensions = numDimensions; } + void SetFrameDatabaseInfo(const ImGuiMonitorRequests::FrameDatabaseInfo& info) override { m_frameDatabaseInfo = info; } + void SetFeatureMatrixInfo(const ImGuiMonitorRequests::FeatureMatrixInfo& info) override { m_featurMatrixInfo = info; } + void SetKdTreeInfo(const ImGuiMonitorRequests::KdTreeInfo& info) override { m_kdTreeInfo = info; } private: - //! Named and sub-divided group containing several histograms. - struct HistogramGroup - { - void OnImGuiUpdate(); - void PushHistogramValue(const char* valueName, float value, const AZ::Color& color); - - bool m_show = true; - AZStd::string m_name; - using HistogramIndexByNames = AZStd::unordered_map; - HistogramIndexByNames m_histogramIndexByName; - AZStd::vector m_histograms; - int m_histogramContainerCount = 500; - - static constexpr float s_histogramHeight = 95.0f; - }; - - HistogramGroup m_performanceStats; - HistogramGroup m_featureCosts; - - size_t m_featureMatrixMemoryUsageInBytes = 0; - size_t m_featureMatrixNumFrames = 0; - size_t m_featureMatrixNumComponents = 0; + ImGui::LYImGuiUtils::HistogramGroup m_performanceStats; + ImGui::LYImGuiUtils::HistogramGroup m_featureCosts; - size_t m_kdTreeMemoryUsageInBytes = 0; - size_t m_kdTreeNumNodes = 0; - size_t m_kdTreeNumDimensions = 0; + ImGuiMonitorRequests::FrameDatabaseInfo m_frameDatabaseInfo; + ImGuiMonitorRequests::FeatureMatrixInfo m_featurMatrixInfo; + ImGuiMonitorRequests::KdTreeInfo m_kdTreeInfo; }; } // namespace EMotionFX::MotionMatching diff --git a/Gems/MotionMatching/Code/Source/ImGuiMonitorBus.h b/Gems/MotionMatching/Code/Source/ImGuiMonitorBus.h index 7c50b317c5..faadd79681 100644 --- a/Gems/MotionMatching/Code/Source/ImGuiMonitorBus.h +++ b/Gems/MotionMatching/Code/Source/ImGuiMonitorBus.h @@ -25,13 +25,30 @@ namespace EMotionFX::MotionMatching virtual void PushPerformanceHistogramValue(const char* performanceMetricName, float value) = 0; virtual void PushCostHistogramValue(const char* costName, float value, const AZ::Color& color) = 0; - virtual void SetFeatureMatrixMemoryUsage(size_t sizeInBytes) = 0; - virtual void SetFeatureMatrixNumFrames(size_t numFrames) = 0; - virtual void SetFeatureMatrixNumComponents(size_t numFeatureComponents) = 0; + struct FrameDatabaseInfo + { + size_t m_memoryUsedInBytes = 0; + size_t m_numFrames; + size_t m_numMotions; + float m_motionDataInSeconds; + }; + virtual void SetFrameDatabaseInfo(const FrameDatabaseInfo& info) = 0; - virtual void SetKdTreeMemoryUsage(size_t sizeInBytes) = 0; - virtual void SetKdTreeNumNodes(size_t numNodes) = 0; - virtual void SetKdTreeNumDimensions(size_t numDimensions) = 0; + struct FeatureMatrixInfo + { + size_t m_memoryUsedInBytes = 0; + size_t m_numFrames = 0; + size_t m_numDimensions = 0; + }; + virtual void SetFeatureMatrixInfo(const FeatureMatrixInfo& info) = 0; + + struct KdTreeInfo + { + size_t m_memoryUsedInBytes = 0; + size_t m_numNodes = 0; + size_t m_numDimensions = 0; + }; + virtual void SetKdTreeInfo(const KdTreeInfo& info) = 0; }; using ImGuiMonitorRequestBus = AZ::EBus; } // namespace EMotionFX::MotionMatching diff --git a/Gems/MotionMatching/Code/Source/MotionMatchingInstance.cpp b/Gems/MotionMatching/Code/Source/MotionMatchingInstance.cpp index 54fc2918e6..36a51f2677 100644 --- a/Gems/MotionMatching/Code/Source/MotionMatchingInstance.cpp +++ b/Gems/MotionMatching/Code/Source/MotionMatchingInstance.cpp @@ -28,14 +28,14 @@ #include #include -#include - namespace EMotionFX::MotionMatching { AZ_CLASS_ALLOCATOR_IMPL(MotionMatchingInstance, MotionMatchAllocator, 0) MotionMatchingInstance::~MotionMatchingInstance() { + DebugDrawRequestBus::Handler::BusDisconnect(); + if (m_motionInstance) { GetMotionInstancePool().Free(m_motionInstance); @@ -58,6 +58,8 @@ namespace EMotionFX::MotionMatching AZ_Assert(settings.m_actorInstance, "The actor instance cannot be a nullptr."); AZ_Assert(settings.m_data, "The motion match data cannot be nullptr."); + DebugDrawRequestBus::Handler::BusConnect(); + // Update the cached pointer to the trajectory feature. const FeatureSchema& featureSchema = settings.m_data->GetFeatureSchema(); for (Feature* feature : featureSchema.GetFeatures()) @@ -69,29 +71,6 @@ namespace EMotionFX::MotionMatching } } - // Debug display initialization. - const auto AddDebugDisplay = [=](AZ::s32 debugDisplayId) - { - if (debugDisplayId == -1) - { - return; - } - - AzFramework::DebugDisplayRequestBus::BusPtr debugDisplayBus; - AzFramework::DebugDisplayRequestBus::Bind(debugDisplayBus, debugDisplayId); - - AzFramework::DebugDisplayRequests* debugDisplay = AzFramework::DebugDisplayRequestBus::FindFirstHandler(debugDisplayBus); - if (debugDisplay) - { - m_debugDisplays.emplace_back(debugDisplay); - } - }; - // Draw the debug visualizations to the Animation Editor as well as the LY Editor viewport. - AZ::s32 animationEditorViewportId = -1; - EMStudio::ViewportPluginRequestBus::BroadcastResult(animationEditorViewportId, &EMStudio::ViewportPluginRequestBus::Events::GetViewportId); - AddDebugDisplay(animationEditorViewportId); - AddDebugDisplay(AzFramework::g_defaultSceneEntityDebugDisplayId); - m_actorInstance = settings.m_actorInstance; m_data = settings.m_data; if (settings.m_data->GetFrameDatabase().GetNumFrames() == 0) @@ -123,30 +102,17 @@ namespace EMotionFX::MotionMatching m_queryFeatureValues.resize(numValuesInKdTree); // Initialize the trajectory history. - size_t rootJointIndex = m_actorInstance->GetActor()->GetMotionExtractionNodeIndex(); - if (rootJointIndex == InvalidIndex32) + if (m_cachedTrajectoryFeature) { - rootJointIndex = 0; - } - m_trajectoryHistory.Init(*m_actorInstance->GetTransformData()->GetCurrentPose(), - rootJointIndex, - m_cachedTrajectoryFeature->GetFacingAxisDir(), - m_trajectorySecsToTrack); - } - - void MotionMatchingInstance::DebugDraw() - { - if (m_data && !m_debugDisplays.empty()) - { - for (AzFramework::DebugDisplayRequests* debugDisplay : m_debugDisplays) + size_t rootJointIndex = m_actorInstance->GetActor()->GetMotionExtractionNodeIndex(); + if (rootJointIndex == InvalidIndex32) { - if (debugDisplay) - { - const AZ::u32 prevState = debugDisplay->GetState(); - DebugDraw(*debugDisplay); - debugDisplay->SetState(prevState); - } + rootJointIndex = 0; } + m_trajectoryHistory.Init(*m_actorInstance->GetTransformData()->GetCurrentPose(), + rootJointIndex, + m_cachedTrajectoryFeature->GetFacingAxisDir(), + m_trajectorySecsToTrack); } } @@ -306,7 +272,7 @@ namespace EMotionFX::MotionMatching { AZ_PROFILE_SCOPE(Animation, "MotionMatchingInstance::Update"); - if (!m_data) + if (!m_data || !m_motionInstance) { return; } @@ -322,7 +288,7 @@ namespace EMotionFX::MotionMatching // Update the time. After this there is no sample for the updated time in the history as we're about to prepare this with the current update. m_trajectoryHistory.Update(timePassedInSeconds); - // Register the current actor instance position to the history data of the spline. + // Update the trajectory query control points. m_trajectoryQuery.Update(m_actorInstance, m_cachedTrajectoryFeature, m_trajectoryHistory, @@ -371,8 +337,7 @@ namespace EMotionFX::MotionMatching SamplePose(m_motionInstance->GetMotion(), m_queryPose, newMotionTime); // Copy over the motion extraction joint transform from the current pose to the newly sampled pose. - // When sampling a motion, the motion extraction joint is in animation space, while we need the query pose to be in - // world space. + // When sampling a motion, the motion extraction joint is in animation space, while we need the query pose to be in world space. // Note: This does not yet take the extraction delta from the current tick into account. if (m_actorInstance->GetActor()->GetMotionExtractionNode()) { @@ -433,16 +398,17 @@ namespace EMotionFX::MotionMatching // ImGui monitor { #ifdef IMGUI_ENABLED - const KdTree& kdTree = m_data->GetKdTree(); - ImGuiMonitorRequestBus::Broadcast(&ImGuiMonitorRequests::SetKdTreeMemoryUsage, kdTree.CalcMemoryUsageInBytes()); - ImGuiMonitorRequestBus::Broadcast(&ImGuiMonitorRequests::SetKdTreeNumNodes, kdTree.GetNumNodes()); - ImGuiMonitorRequestBus::Broadcast(&ImGuiMonitorRequests::SetKdTreeNumDimensions, kdTree.GetNumDimensions()); - // TODO: add memory usage for frame database + const FrameDatabase& frameDatabase = m_data->GetFrameDatabase(); + ImGuiMonitorRequests::FrameDatabaseInfo frameDatabaseInfo{frameDatabase.CalcMemoryUsageInBytes(), frameDatabase.GetNumFrames(), frameDatabase.GetNumUsedMotions(), frameDatabase.GetNumFrames() / (float)frameDatabase.GetSampleRate()}; + ImGuiMonitorRequestBus::Broadcast(&ImGuiMonitorRequests::SetFrameDatabaseInfo, frameDatabaseInfo); + const KdTree& kdTree = m_data->GetKdTree(); + ImGuiMonitorRequests::KdTreeInfo kdTreeInfo{kdTree.CalcMemoryUsageInBytes(), kdTree.GetNumNodes(), kdTree.GetNumDimensions()}; + ImGuiMonitorRequestBus::Broadcast(&ImGuiMonitorRequests::SetKdTreeInfo, kdTreeInfo); + const FeatureMatrix& featureMatrix = m_data->GetFeatureMatrix(); - ImGuiMonitorRequestBus::Broadcast(&ImGuiMonitorRequests::SetFeatureMatrixMemoryUsage, featureMatrix.CalcMemoryUsageInBytes()); - ImGuiMonitorRequestBus::Broadcast(&ImGuiMonitorRequests::SetFeatureMatrixNumFrames, featureMatrix.rows()); - ImGuiMonitorRequestBus::Broadcast(&ImGuiMonitorRequests::SetFeatureMatrixNumComponents, featureMatrix.cols()); + ImGuiMonitorRequests::FeatureMatrixInfo featureMatrixInfo{featureMatrix.CalcMemoryUsageInBytes(), static_cast(featureMatrix.rows()), static_cast(featureMatrix.cols())}; + ImGuiMonitorRequestBus::Broadcast(&ImGuiMonitorRequests::SetFeatureMatrixInfo, featureMatrixInfo); #endif } } diff --git a/Gems/MotionMatching/Code/Source/MotionMatchingInstance.h b/Gems/MotionMatching/Code/Source/MotionMatchingInstance.h index 49c781162d..0969763809 100644 --- a/Gems/MotionMatching/Code/Source/MotionMatchingInstance.h +++ b/Gems/MotionMatching/Code/Source/MotionMatchingInstance.h @@ -19,6 +19,8 @@ #include #include +#include + namespace AZ { class ReflectContext; @@ -34,12 +36,17 @@ namespace EMotionFX::MotionMatching { class MotionMatchingData; + //! The instance is where everything comes together. It stores the trajectory history, the trajectory query along with the query vector, knows about the + //! last lowest cost frame frame index and stores the time of the animation that the instance is currently playing. It is responsible for motion extraction, + //! blending towards a new frame in the motion capture database in case the algorithm found a better matching frame and executes the actual search. class EMFX_API MotionMatchingInstance + : public DebugDrawRequestBus::Handler { public: AZ_RTTI(MotionMatchingInstance, "{1ED03AD8-0FB2-431B-AF01-02F7E930EB73}") AZ_CLASS_ALLOCATOR_DECL + MotionMatchingInstance() = default; virtual ~MotionMatchingInstance(); struct EMFX_API InitSettings @@ -49,8 +56,8 @@ namespace EMotionFX::MotionMatching }; void Init(const InitSettings& settings); - void DebugDraw(); - void DebugDraw(AzFramework::DebugDisplayRequests& debugDisplay); + // DebugDrawRequestBus::Handler overrides + void DebugDraw(AzFramework::DebugDisplayRequests& debugDisplay) override; void Update(float timePassedInSeconds, const AZ::Vector3& targetPos, const AZ::Vector3& targetFacingDir, TrajectoryQuery::EMode mode, float pathRadius, float pathSpeed); void PostUpdate(float timeDelta); @@ -64,10 +71,8 @@ namespace EMotionFX::MotionMatching void SetLowestCostSearchFrequency(float frequency) { m_lowestCostSearchFrequency = frequency; } float GetNewMotionTime() const { return m_newMotionTime; } - /** - * Get the cached trajectory feature. - * The trajectory feature is searched in the feature schema used in the current instance at init time. - */ + //! Get the cached trajectory feature. + //! The trajectory feature is searched in the feature schema used in the current instance at init time. FeatureTrajectory* GetTrajectoryFeature() const { return m_cachedTrajectoryFeature; } const TrajectoryQuery& GetTrajectoryQuery() const { return m_trajectoryQuery; } const TrajectoryHistory& GetTrajectoryHistory() const { return m_trajectoryHistory; } @@ -90,10 +95,10 @@ namespace EMotionFX::MotionMatching Transform m_motionExtractionDelta = Transform::CreateIdentity(); /// Buffers used for the broad-phase KD-tree search. - AZStd::vector m_queryFeatureValues; /** The input query features to be compared to every entry/row in the feature matrix with the motion matching search. */ - AZStd::vector m_nearestFrames; /** Stores the nearest matching frames / search result from the KD-tree. */ + AZStd::vector m_queryFeatureValues; //< The input query features to be compared to every entry/row in the feature matrix with the motion matching search. + AZStd::vector m_nearestFrames; //< Stores the nearest matching frames / search result from the KD-tree. - FeatureTrajectory* m_cachedTrajectoryFeature = nullptr; /** Cached pointer to the trajectory feature in the feature schema. */ + FeatureTrajectory* m_cachedTrajectoryFeature = nullptr; //< Cached pointer to the trajectory feature in the feature schema. TrajectoryQuery m_trajectoryQuery; TrajectoryHistory m_trajectoryHistory; static constexpr float m_trajectorySecsToTrack = 5.0f; @@ -105,7 +110,7 @@ namespace EMotionFX::MotionMatching bool m_blending = false; float m_blendWeight = 1.0f; - float m_blendProgressTime = 0.0f; // How long are we already blending? In seconds. + float m_blendProgressTime = 0.0f; //< How long are we already blending? In seconds. /// Buffers used for FindLowestCostFrameIndex(). AZStd::vector m_tempCosts; diff --git a/Gems/MotionMatching/Code/Source/MotionMatchingSystemComponent.cpp b/Gems/MotionMatching/Code/Source/MotionMatchingSystemComponent.cpp index 073362d741..9091c60c0a 100644 --- a/Gems/MotionMatching/Code/Source/MotionMatchingSystemComponent.cpp +++ b/Gems/MotionMatching/Code/Source/MotionMatchingSystemComponent.cpp @@ -16,6 +16,8 @@ #include +#include + #include #include #include @@ -39,7 +41,7 @@ namespace EMotionFX::MotionMatching { ec->Class("MotionMatching", "[Description of functionality provided by this System Component]") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("System")) + ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System")) ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ; } @@ -69,9 +71,9 @@ namespace EMotionFX::MotionMatching incompatible.push_back(AZ_CRC_CE("MotionMatchingService")); } - void MotionMatchingSystemComponent::GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required) + void MotionMatchingSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) { - required.push_back(AZ_CRC("EMotionFXAnimationService", 0x3f8a6369)); + required.push_back(AZ_CRC_CE("EMotionFXAnimationService")); } void MotionMatchingSystemComponent::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent) @@ -122,7 +124,33 @@ namespace EMotionFX::MotionMatching MotionMatchingRequestBus::Handler::BusDisconnect(); } + void MotionMatchingSystemComponent::DebugDraw(AZ::s32 debugDisplayId) + { + AZ_PROFILE_SCOPE(Animation, "MotionMatchingSystemComponent::DebugDraw"); + + if (debugDisplayId == -1) + { + return; + } + + AzFramework::DebugDisplayRequestBus::BusPtr debugDisplayBus; + AzFramework::DebugDisplayRequestBus::Bind(debugDisplayBus, debugDisplayId); + + AzFramework::DebugDisplayRequests* debugDisplay = AzFramework::DebugDisplayRequestBus::FindFirstHandler(debugDisplayBus); + if (debugDisplay) + { + const AZ::u32 prevState = debugDisplay->GetState(); + EMotionFX::MotionMatching::DebugDrawRequestBus::Broadcast(&EMotionFX::MotionMatching::DebugDrawRequests::DebugDraw, *debugDisplay); + debugDisplay->SetState(prevState); + } + } + void MotionMatchingSystemComponent::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time) { + // Draw the debug visualizations to the Animation Editor as well as the LY Editor viewport. + AZ::s32 animationEditorViewportId = -1; + EMStudio::ViewportPluginRequestBus::BroadcastResult(animationEditorViewportId, &EMStudio::ViewportPluginRequestBus::Events::GetViewportId); + DebugDraw(animationEditorViewportId); + DebugDraw(AzFramework::g_defaultSceneEntityDebugDisplayId); } } // namespace EMotionFX::MotionMatching diff --git a/Gems/MotionMatching/Code/Source/MotionMatchingSystemComponent.h b/Gems/MotionMatching/Code/Source/MotionMatchingSystemComponent.h index 6a5b5a7b73..09d47b9dc3 100644 --- a/Gems/MotionMatching/Code/Source/MotionMatchingSystemComponent.h +++ b/Gems/MotionMatching/Code/Source/MotionMatchingSystemComponent.h @@ -33,8 +33,7 @@ namespace EMotionFX::MotionMatching ~MotionMatchingSystemComponent(); protected: - //////////////////////////////////////////////////////////////////////// - // MotionMatchingRequestBus interface implementation + void DebugDraw(AZ::s32 debugDisplayId); //////////////////////////////////////////////////////////////////////// // AZ::Component interface implementation @@ -45,6 +44,10 @@ namespace EMotionFX::MotionMatching //////////////////////////////////////////////////////////////////////// // AZTickBus interface implementation + int GetTickOrder() override + { + return AZ::TICK_PRE_RENDER; + } void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; //////////////////////////////////////////////////////////////////////// }; diff --git a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTypes.h b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTypes.h index c892bc8c09..943c45bb6a 100644 --- a/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTypes.h +++ b/Gems/SurfaceData/Code/Include/SurfaceData/SurfaceDataTypes.h @@ -24,9 +24,17 @@ namespace SurfaceData using SurfaceTagVector = AZStd::vector; //! SurfaceTagWeights stores a collection of surface tags and weights. + //! A surface tag can only appear once in the collection. Attempting to add it multiple times will always preserve the + //! highest weight value. class SurfaceTagWeights { public: + //! The maximum number of surface weights that we can store. + //! For performance reasons, we want to limit this so that we can preallocate the max size in advance. + //! The current number is chosen to be higher than expected needs, but small enough to avoid being excessively wasteful. + //! (Dynamic structures would end up taking more memory than what we're preallocating) + static inline constexpr size_t MaxSurfaceWeights = 16; + SurfaceTagWeights() = default; //! Construct a collection of SurfaceTagWeights from the given SurfaceTagWeightList. @@ -45,42 +53,68 @@ namespace SurfaceData //! @param weight - The weight to assign to each tag. void AssignSurfaceTagWeights(const SurfaceTagVector& tags, float weight); - //! Add a surface tag weight to this collection. - //! @param tag - The surface tag. - //! @param weight - The surface tag weight. - void AddSurfaceTagWeight(const AZ::Crc32 tag, const float weight); - - //! Replace the surface tag weight with the new one if it's higher, or add it if the tag isn't found. + //! Add a surface tag weight to this collection. If the tag already exists, the higher weight will be preserved. //! (This method is intentionally inlined for its performance impact) //! @param tag - The surface tag. //! @param weight - The surface tag weight. - void AddSurfaceWeightIfGreater(const AZ::Crc32 tag, const float weight) + void AddSurfaceTagWeight(const AZ::Crc32 tag, const float weight) { - const auto maskItr = m_weights.find(tag); - const float previousValue = maskItr != m_weights.end() ? maskItr->second : 0.0f; - m_weights[tag] = AZ::GetMax(weight, previousValue); + for (auto weightItr = m_weights.begin(); weightItr != m_weights.end(); ++weightItr) + { + // Since we need to scan for duplicate surface types, store the entries sorted by surface type so that we can + // early-out once we pass the location for the entry instead of always searching every entry. + if (weightItr->m_surfaceType > tag) + { + if (m_weights.size() != MaxSurfaceWeights) + { + // We didn't find the surface type, so add the new entry in sorted order. + m_weights.insert(weightItr, { tag, weight }); + } + else + { + AZ_Assert(false, "SurfaceTagWeights has reached max capacity, it cannot add a new tag / weight."); + } + return; + } + else if (weightItr->m_surfaceType == tag) + { + // We found the surface type, so just keep the higher of the two weights. + weightItr->m_weight = AZ::GetMax(weight, weightItr->m_weight); + return; + } + } + + // We didn't find the surface weight, and the sort order for it is at the end, so add it to the back of the list. + if (m_weights.size() != MaxSurfaceWeights) + { + m_weights.emplace_back(tag, weight); + } + else + { + AZ_Assert(false, "SurfaceTagWeights has reached max capacity, it cannot add a new tag / weight."); + } } - //! Replace the surface tag weight with the new one if it's higher, or add it if the tag isn't found. + //! Add surface tags and weights to this collection. If a tag already exists, the higher weight will be preserved. //! (This method is intentionally inlined for its performance impact) //! @param tags - The surface tags to replace/add. //! @param weight - The surface tag weight to use for each tag. - void AddSurfaceWeightsIfGreater(const SurfaceTagVector& tags, const float weight) + void AddSurfaceTagWeights(const SurfaceTagVector& tags, const float weight) { for (const auto& tag : tags) { - AddSurfaceWeightIfGreater(tag, weight); + AddSurfaceTagWeight(tag, weight); } } - //! Replace the surface tag weight with the new one if it's higher, or add it if the tag isn't found. + //! Add surface tags and weights to this collection. If a tag already exists, the higher weight will be preserved. //! (This method is intentionally inlined for its performance impact) //! @param weights - The surface tags and weights to replace/add. - void AddSurfaceWeightsIfGreater(const SurfaceTagWeights& weights) + void AddSurfaceTagWeights(const SurfaceTagWeights& weights) { for (const auto& [tag, weight] : weights.m_weights) { - AddSurfaceWeightIfGreater(tag, weight); + AddSurfaceTagWeight(tag, weight); } } @@ -125,7 +159,7 @@ namespace SurfaceData //! Check to see if the collection contains the given tag. //! @param sampleTag - The tag to look for. //! @return True if the tag is found, false if it isn't. - bool HasMatchingTag(const AZ::Crc32& sampleTag) const; + bool HasMatchingTag(AZ::Crc32 sampleTag) const; //! Check to see if the collection contains the given tag with the given weight range. //! The range check is inclusive on both sides of the range: [weightMin, weightMax] @@ -133,7 +167,7 @@ namespace SurfaceData //! @param weightMin - The minimum weight for this tag. //! @param weightMax - The maximum weight for this tag. //! @return True if the tag is found, false if it isn't. - bool HasMatchingTag(const AZ::Crc32& sampleTag, float weightMin, float weightMax) const; + bool HasMatchingTag(AZ::Crc32 sampleTag, float weightMin, float weightMax) const; //! Check to see if the collection contains any of the given tags. //! @param sampleTags - The tags to look for. @@ -149,7 +183,12 @@ namespace SurfaceData bool HasAnyMatchingTags(const SurfaceTagVector& sampleTags, float weightMin, float weightMax) const; private: - AZStd::unordered_map m_weights; + //! Search for the given tag entry. + //! @param tag - The tag to search for. + //! @return The pointer to the tag that's found, or end() if it wasn't found. + const AzFramework::SurfaceData::SurfaceTagWeight* FindTag(AZ::Crc32 tag) const; + + AZStd::fixed_vector m_weights; }; //! SurfacePointList stores a collection of surface point data, which consists of positions, normals, and surface tag weights. diff --git a/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp b/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp index e51fbc09b2..86a165b7d8 100644 --- a/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp +++ b/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp @@ -259,7 +259,7 @@ namespace SurfaceData if (DoRayTrace(position, queryPointOnly, hitPosition, hitNormal)) { // If the query point collides with the volume, add all our modifier tags with a weight of 1.0f. - weights.AddSurfaceWeightsIfGreater(m_configuration.m_modifierTags, 1.0f); + weights.AddSurfaceTagWeights(m_configuration.m_modifierTags, 1.0f); } } }); diff --git a/Gems/SurfaceData/Code/Source/Components/SurfaceDataShapeComponent.cpp b/Gems/SurfaceData/Code/Source/Components/SurfaceDataShapeComponent.cpp index b84607782e..481372b7dc 100644 --- a/Gems/SurfaceData/Code/Source/Components/SurfaceDataShapeComponent.cpp +++ b/Gems/SurfaceData/Code/Source/Components/SurfaceDataShapeComponent.cpp @@ -179,7 +179,7 @@ namespace SurfaceData if (m_shapeBounds.Contains(position) && shape->IsPointInside(position)) { // If the point is inside our shape, add all our modifier tags with a weight of 1.0f. - weights.AddSurfaceWeightsIfGreater(m_configuration.m_modifierTags, 1.0f); + weights.AddSurfaceTagWeights(m_configuration.m_modifierTags, 1.0f); } }); }); diff --git a/Gems/SurfaceData/Code/Source/SurfaceDataTypes.cpp b/Gems/SurfaceData/Code/Source/SurfaceDataTypes.cpp index 3071fd02ee..04c1ada677 100644 --- a/Gems/SurfaceData/Code/Source/SurfaceDataTypes.cpp +++ b/Gems/SurfaceData/Code/Source/SurfaceDataTypes.cpp @@ -14,28 +14,21 @@ namespace SurfaceData void SurfaceTagWeights::AssignSurfaceTagWeights(const AzFramework::SurfaceData::SurfaceTagWeightList& weights) { m_weights.clear(); - m_weights.reserve(weights.size()); for (auto& weight : weights) { - m_weights.emplace(weight.m_surfaceType, weight.m_weight); + AddSurfaceTagWeight(weight.m_surfaceType, weight.m_weight); } } void SurfaceTagWeights::AssignSurfaceTagWeights(const SurfaceTagVector& tags, float weight) { m_weights.clear(); - m_weights.reserve(tags.size()); for (auto& tag : tags) { - m_weights[tag] = weight; + AddSurfaceTagWeight(tag.operator AZ::Crc32(), weight); } } - void SurfaceTagWeights::AddSurfaceTagWeight(const AZ::Crc32 tag, const float value) - { - m_weights[tag] = value; - } - void SurfaceTagWeights::Clear() { m_weights.clear(); @@ -52,7 +45,7 @@ namespace SurfaceData weights.reserve(m_weights.size()); for (auto& weight : m_weights) { - weights.emplace_back(weight.first, weight.second); + weights.emplace_back(weight); } return weights; } @@ -65,17 +58,8 @@ namespace SurfaceData return false; } - for (auto& weight : m_weights) - { - auto rhsWeight = rhs.m_weights.find(weight.first); - if ((rhsWeight == rhs.m_weights.end()) || (rhsWeight->second != weight.second)) - { - return false; - } - } - - // All the entries matched, and the lists are the same size, so they're equal. - return true; + // The lists are stored in sorted order, so we can compare every entry in order for equivalence. + return (m_weights == rhs.m_weights); } bool SurfaceTagWeights::SurfaceWeightsAreEqual(const AzFramework::SurfaceData::SurfaceTagWeightList& compareWeights) const @@ -92,7 +76,7 @@ namespace SurfaceData compareWeights.begin(), compareWeights.end(), [weight](const AzFramework::SurfaceData::SurfaceTagWeight& compareWeight) -> bool { - return (weight.first == compareWeight.m_surfaceType) && (weight.second == compareWeight.m_weight); + return (weight == compareWeight); }); // If we didn't find a match, they're not equal. @@ -119,9 +103,9 @@ namespace SurfaceData bool SurfaceTagWeights::HasValidTags() const { - for (const auto& sourceTag : m_weights) + for (const auto& weight : m_weights) { - if (sourceTag.first != Constants::s_unassignedTagCrc) + if (weight.m_surfaceType != Constants::s_unassignedTagCrc) { return true; } @@ -129,9 +113,9 @@ namespace SurfaceData return false; } - bool SurfaceTagWeights::HasMatchingTag(const AZ::Crc32& sampleTag) const + bool SurfaceTagWeights::HasMatchingTag(AZ::Crc32 sampleTag) const { - return m_weights.find(sampleTag) != m_weights.end(); + return FindTag(sampleTag) != m_weights.end(); } bool SurfaceTagWeights::HasAnyMatchingTags(const SurfaceTagVector& sampleTags) const @@ -147,10 +131,10 @@ namespace SurfaceData return false; } - bool SurfaceTagWeights::HasMatchingTag(const AZ::Crc32& sampleTag, float weightMin, float weightMax) const + bool SurfaceTagWeights::HasMatchingTag(AZ::Crc32 sampleTag, float weightMin, float weightMax) const { - auto maskItr = m_weights.find(sampleTag); - return maskItr != m_weights.end() && weightMin <= maskItr->second && weightMax >= maskItr->second; + auto weightEntry = FindTag(sampleTag); + return weightEntry != m_weights.end() && weightMin <= weightEntry->m_weight && weightMax >= weightEntry->m_weight; } bool SurfaceTagWeights::HasAnyMatchingTags(const SurfaceTagVector& sampleTags, float weightMin, float weightMax) const @@ -166,7 +150,25 @@ namespace SurfaceData return false; } + const AzFramework::SurfaceData::SurfaceTagWeight* SurfaceTagWeights::FindTag(AZ::Crc32 tag) const + { + for (auto weightItr = m_weights.begin(); weightItr != m_weights.end(); ++weightItr) + { + if (weightItr->m_surfaceType == tag) + { + // Found the tag, return a pointer to the entry. + return weightItr; + } + else if (weightItr->m_surfaceType > tag) + { + // Our list is stored in sorted order by surfaceType, so early-out if our values get too high. + break; + } + } + // The tag wasn't found, so return end(). + return m_weights.end(); + } SurfacePointList::SurfacePointList(AZStd::initializer_list surfacePoints) @@ -192,7 +194,7 @@ namespace SurfaceData if (m_surfacePositionList[index].IsClose(position) && m_surfaceNormalList[index].IsClose(normal)) { // consolidate points with similar attributes by adding masks/weights to the similar point instead of adding a new one. - m_surfaceWeightsList[index].AddSurfaceWeightsIfGreater(masks); + m_surfaceWeightsList[index].AddSurfaceTagWeights(masks); return; } else if (m_surfacePositionList[index].GetZ() < position.GetZ()) diff --git a/Gems/SurfaceData/Code/Tests/SurfaceDataBenchmarks.cpp b/Gems/SurfaceData/Code/Tests/SurfaceDataBenchmarks.cpp index 226a711cff..f8b4c675a5 100644 --- a/Gems/SurfaceData/Code/Tests/SurfaceDataBenchmarks.cpp +++ b/Gems/SurfaceData/Code/Tests/SurfaceDataBenchmarks.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -270,6 +271,88 @@ namespace UnitTest ->Arg( 2048 ) ->Unit(::benchmark::kMillisecond); + BENCHMARK_DEFINE_F(SurfaceDataBenchmark, BM_AddSurfaceTagWeight)(benchmark::State& state) + { + AZ_PROFILE_FUNCTION(Entity); + + AZ::Crc32 tags[SurfaceData::SurfaceTagWeights::MaxSurfaceWeights]; + AZ::SimpleLcgRandom randomGenerator(1234567); + + // Declare this outside the loop so that we aren't benchmarking creation and destruction. + SurfaceData::SurfaceTagWeights weights; + + bool clearEachTime = state.range(0) > 0; + + // Create a list of randomly-generated tag values. + for (auto& tag : tags) + { + tag = randomGenerator.GetRandom(); + } + + for (auto _ : state) + { + // We'll benchmark this two ways: + // 1. We clear each time, which means each AddSurfaceWeightIfGreater call will search the whole list then add. + // 2. We don't clear, which means that after the first run, AddSurfaceWeightIfGreater will always try to replace values. + if (clearEachTime) + { + weights.Clear(); + } + + // For each tag, try to add it with a random weight. + for (auto& tag : tags) + { + weights.AddSurfaceTagWeight(tag, randomGenerator.GetRandomFloat()); + } + } + } + + BENCHMARK_REGISTER_F(SurfaceDataBenchmark, BM_AddSurfaceTagWeight) + ->Arg(false) + ->Arg(true) + ->ArgName("ClearEachTime"); + + BENCHMARK_DEFINE_F(SurfaceDataBenchmark, BM_HasAnyMatchingTags_NoMatches)(benchmark::State& state) + { + AZ_PROFILE_FUNCTION(Entity); + + AZ::Crc32 tags[SurfaceData::SurfaceTagWeights::MaxSurfaceWeights]; + AZ::SimpleLcgRandom randomGenerator(1234567); + + // Declare this outside the loop so that we aren't benchmarking creation and destruction. + SurfaceData::SurfaceTagWeights weights; + + // Create a list of randomly-generated tag values. + for (auto& tag : tags) + { + // Specifically always set the last bit so that we can create comparison tags that won't match. + tag = randomGenerator.GetRandom() | 0x01; + + // Add the tag to our weights list with a random weight. + weights.AddSurfaceTagWeight(tag, randomGenerator.GetRandomFloat()); + } + + // Create a set of similar comparison tags that won't match. We still want a random distribution of values though, + // because the SurfaceTagWeights might behave differently with ordered lists. + SurfaceData::SurfaceTagVector comparisonTags; + for (auto& tag : tags) + { + comparisonTags.emplace_back(tag ^ 0x01); + } + + for (auto _ : state) + { + // Test to see if any of our tags match. + // All of comparison tags should get compared against all of the added tags. + bool result = weights.HasAnyMatchingTags(comparisonTags); + benchmark::DoNotOptimize(result); + } + } + + BENCHMARK_REGISTER_F(SurfaceDataBenchmark, BM_HasAnyMatchingTags_NoMatches); + + + #endif } diff --git a/Gems/SurfaceData/Code/Tests/SurfaceDataTest.cpp b/Gems/SurfaceData/Code/Tests/SurfaceDataTest.cpp index 39659313f5..f4ff0cb04c 100644 --- a/Gems/SurfaceData/Code/Tests/SurfaceDataTest.cpp +++ b/Gems/SurfaceData/Code/Tests/SurfaceDataTest.cpp @@ -169,7 +169,7 @@ class MockSurfaceProvider if (surfacePoints != m_GetSurfacePoints.end()) { - weights.AddSurfaceWeightsIfGreater(m_tags, 1.0f); + weights.AddSurfaceTagWeights(m_tags, 1.0f); } }); } diff --git a/Gems/Vegetation/Code/Source/AreaSystemComponent.cpp b/Gems/Vegetation/Code/Source/AreaSystemComponent.cpp index e575480ff4..f4ef3bd6f1 100644 --- a/Gems/Vegetation/Code/Source/AreaSystemComponent.cpp +++ b/Gems/Vegetation/Code/Source/AreaSystemComponent.cpp @@ -1137,7 +1137,7 @@ namespace Vegetation claimPoint.m_position = position; claimPoint.m_normal = normal; claimPoint.m_masks = masks; - sectorInfo.m_baseContext.m_masks.AddSurfaceWeightsIfGreater(masks); + sectorInfo.m_baseContext.m_masks.AddSurfaceTagWeights(masks); return true; }); } diff --git a/Registry/gem_autoload.materialeditor.setreg b/Registry/gem_autoload.materialeditor.setreg index 653cc80056..293fcab1b1 100644 --- a/Registry/gem_autoload.materialeditor.setreg +++ b/Registry/gem_autoload.materialeditor.setreg @@ -28,7 +28,7 @@ "ScriptCanvas.Editor": { "AutoLoad": false }, - "ScriptCanvasDeveloper": { + "ScriptCanvasDeveloper.Editor": { "AutoLoad": false }, "ScriptCanvasPhysics": { diff --git a/Registry/gem_autoload.shadermanagementconsole.setreg b/Registry/gem_autoload.shadermanagementconsole.setreg index 653cc80056..293fcab1b1 100644 --- a/Registry/gem_autoload.shadermanagementconsole.setreg +++ b/Registry/gem_autoload.shadermanagementconsole.setreg @@ -28,7 +28,7 @@ "ScriptCanvas.Editor": { "AutoLoad": false }, - "ScriptCanvasDeveloper": { + "ScriptCanvasDeveloper.Editor": { "AutoLoad": false }, "ScriptCanvasPhysics": { diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index f20b67307b..5d30abfb4d 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -19,7 +19,7 @@ ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform ly_associate_package(PACKAGE_NAME xxhash-0.7.4-rev1-multiplatform TARGETS xxhash PACKAGE_HASH e81f3e6c4065975833996dd1fcffe46c3cf0f9e3a4207ec5f4a1b564ba75861e) # platform-specific: -ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev12-linux TARGETS assimplib PACKAGE_HASH 49d32e11c594e58a9079972ad63570dd895ac61e6148e428b9c39a62feb676ee) +ly_associate_package(PACKAGE_NAME assimp-5.1.6-rev1-linux TARGETS assimplib PACKAGE_HASH 40d64242d5d32a69af3a25690b76f051f3c1a573c1bafba0782cb771a53dfab7) ly_associate_package(PACKAGE_NAME AWSGameLiftServerSDK-3.4.1-rev1-linux TARGETS AWSGameLiftServerSDK PACKAGE_HASH a8149a95bd100384af6ade97e2b21a56173740d921e6c3da8188cd51554d39af) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-rev3-linux TARGETS TIFF PACKAGE_HASH 2377f48b2ebc2d1628d9f65186c881544c92891312abe478a20d10b85877409a) ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-linux TARGETS freetype PACKAGE_HASH 3f10c703d9001ecd2bb51a3bd003d3237c02d8f947ad0161c0252fdc54cbcf97) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index fba8f73ba1..082cefee5d 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -19,7 +19,7 @@ ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform ly_associate_package(PACKAGE_NAME xxhash-0.7.4-rev1-multiplatform TARGETS xxhash PACKAGE_HASH e81f3e6c4065975833996dd1fcffe46c3cf0f9e3a4207ec5f4a1b564ba75861e) # platform-specific: -ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev12-mac TARGETS assimplib PACKAGE_HASH 12db03817553f607bee0d65b690bcaae748014f3ed9266b70384f463bc98c9d1) +ly_associate_package(PACKAGE_NAME assimp-5.1.6-rev1-mac TARGETS assimplib PACKAGE_HASH ad35c2e0efd0852021c84b9a454fdcba2fc8af8b7117e9a0dd7ea0a1915932e0) ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-1.6.2104-o3de-rev3-mac TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 3f77367dbb0342136ec4ebbd44bc1fedf7198089a0f83c5631248530769b2be6) ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-mac TARGETS SPIRVCross PACKAGE_HASH 78c6376ed2fd195b9b1f5fb2b56e5267a32c3aa21fb399e905308de470eb4515) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-rev3-mac TARGETS TIFF PACKAGE_HASH c2615ccdadcc0e1d6c5ed61e5965c4d3a82193d206591b79b805c3b3ff35a4bf) diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index e24582a453..dd4d158d1c 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -19,7 +19,7 @@ ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform ly_associate_package(PACKAGE_NAME xxhash-0.7.4-rev1-multiplatform TARGETS xxhash PACKAGE_HASH e81f3e6c4065975833996dd1fcffe46c3cf0f9e3a4207ec5f4a1b564ba75861e) # platform-specific: -ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev12-windows TARGETS assimplib PACKAGE_HASH 5273b7661a7a247bb18e8bc928d25c9cd1bd8ce9dfcc56c50742bac8fa02f0f2) +ly_associate_package(PACKAGE_NAME assimp-5.1.6-rev1-windows TARGETS assimplib PACKAGE_HASH 299d8a3c70657d74af8841650538e9d083fda9356f6782416edbec0ef5a0493e) ly_associate_package(PACKAGE_NAME AWSGameLiftServerSDK-3.4.1-rev1-windows TARGETS AWSGameLiftServerSDK PACKAGE_HASH a0586b006e4def65cc25f388de17dc475e417dc1e6f9d96749777c88aa8271b0) ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-1.6.2104-o3de-rev3-windows TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 803e10b94006b834cbbdd30f562a8ddf04174c2cb6956c8399ec164ef8418d1f) ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-windows TARGETS SPIRVCross PACKAGE_HASH 7d601ea9d625b1d509d38bd132a1f433d7e895b16adab76bac6103567a7a6817) diff --git a/cmake/Platform/Common/Clang/Configurations_clang.cmake b/cmake/Platform/Common/Clang/Configurations_clang.cmake index 2a311d6079..a46ac6647d 100644 --- a/cmake/Platform/Common/Clang/Configurations_clang.cmake +++ b/cmake/Platform/Common/Clang/Configurations_clang.cmake @@ -9,6 +9,8 @@ include(cmake/Platform/Common/Configurations_common.cmake) ly_append_configurations_options( + DEFINES + _FORTIFY_SOURCE=2 COMPILATION -fno-exceptions -fvisibility=hidden @@ -16,6 +18,8 @@ ly_append_configurations_options( -Wall -Werror + -fpie # Position-Independent Executables + ################### # Disabled warnings (please do not disable any others without first consulting sig-build) ################### @@ -35,17 +39,22 @@ ly_append_configurations_options( ################### COMPILATION_DEBUG - -O0 # No optimization - -g # debug symbols - -fno-inline # don't inline functions - -fstack-protector # Add additional checks to catch stack corruption issues + -O0 # No optimization + -g # debug symbols + -fno-inline # don't inline functions + + -fstack-protector-all # Enable stack protectors for all functions + -fstack-check + COMPILATION_PROFILE -O2 - -g # debug symbols + -g # debug symbols + + -fstack-protector-all # Enable stack protectors for all functions + -fstack-check + COMPILATION_RELEASE -O2 - LINK_NON_STATIC - -Wl,-undefined,error ) include(cmake/Platform/Common/TargetIncludeSystemDirectories_supported.cmake) diff --git a/cmake/Platform/Common/GCC/Configurations_gcc.cmake b/cmake/Platform/Common/GCC/Configurations_gcc.cmake index ad5f3bec28..d2d6059b69 100644 --- a/cmake/Platform/Common/GCC/Configurations_gcc.cmake +++ b/cmake/Platform/Common/GCC/Configurations_gcc.cmake @@ -20,6 +20,8 @@ endif() ly_append_configurations_options( + DEFINES + _FORTIFY_SOURCE=2 COMPILATION_C -fno-exceptions @@ -27,6 +29,9 @@ ly_append_configurations_options( -Wall -Werror + -fpie # Position-Independent Executables + -fstack-protector-all # Enable stack protectors for all functions + ${LY_GCC_GCOV_FLAGS} ${LY_GCC_GPROF_FLAGS} @@ -37,6 +42,9 @@ ly_append_configurations_options( -Wall -Werror + -fpie # Position-Independent Executables + -fstack-protector-all # Enable stack protectors for all functions + ${LY_GCC_GCOV_FLAGS} ${LY_GCC_GPROF_FLAGS} @@ -64,19 +72,29 @@ ly_append_configurations_options( -Wno-uninitialized -Wno-unused-but-set-variable -Wno-unused-result - -Wno-unused-value -Wno-unused-variable COMPILATION_DEBUG -O0 # No optimization -g # debug symbols -fno-inline # don't inline functions - -fstack-protector # Add additional checks to catch stack corruption issues COMPILATION_PROFILE -O2 -g # debug symbols COMPILATION_RELEASE -O2 + + LINK_NON_STATIC + -Wl,-undefined,error + -fpie + -Wl,-z,relro,-z,now + -Wl,-z,noexecstack + LINK_EXE + -pie + -fpie + -Wl,-z,relro,-z,now + -Wl,-z,noexecstack + ) include(cmake/Platform/Common/TargetIncludeSystemDirectories_supported.cmake) diff --git a/cmake/Platform/Linux/Configurations_linux.cmake b/cmake/Platform/Linux/Configurations_linux.cmake index 98b946426d..300b7bee10 100644 --- a/cmake/Platform/Linux/Configurations_linux.cmake +++ b/cmake/Platform/Linux/Configurations_linux.cmake @@ -18,7 +18,18 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") COMPILATION -fPIC -msse4.1 + LINK_NON_STATIC + -Wl,-undefined,error + -fpie + -Wl,-z,relro,-z,now + -Wl,-z,noexecstack + LINK_EXE + -pie + -fpie + -Wl,-z,relro,-z,now + -Wl,-z,noexecstack ) + ly_set(CMAKE_CXX_EXTENSIONS OFF) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")